Из того, что я понимаю (пожалуйста, поправьте меня, если я ошибаюсь), у вас есть K двусвязные списки, которые отсортированы. Вы хотите продолжать удалять самый маленький элемент. Каждое удаление должно быть сделано в O (logK) .
Давайте рассмотрим пример:
A = {1, 1, 2, 3}
B = {2, 3, 4, 5}
Вы можете вставить первый элемент каждого списка вместе с тем списком, которому он принадлежит, в min-heap.
heap = [{key: 1, list: A}, {key: 2, list: B}]
Затем вы можете вытолкнуть наименьший элемент из минимальной кучи. Теперь вы можете удалить этот элемент.
min_val = heap.pop() // {key: 1, list: A}
min_list = min_val.list // list = A
min_list.delete_first() // new A = {1, 2, 3}
После удаления вы должны добавить следующий элемент из этого списка обратно в min-heap (если список не пуст, иначе пропустите этот шаг).
heap.add({
key: min_list.fist_element(), // key: 1
list: min_list // list: A
})
// new heap = [{key: 1, list: A}, {key: 2, list: B}]
Теперь вы можете повторять это для каждой операции удаления. Выдвиньте наименьшее из минимальной кучи O (1) , удалите наименьший элемент (т.е. первый элемент из двусвязного списка) O (1) , добавьте следующий элемент из тот же список обратно в min-heap O (logK) .