Merge K Sorted Lists — Min-Heap or Divide and Conquer
Advertisement
Problem 245 · Merge K Sorted Lists
Difficulty: Hard · Pattern: Min-Heap / Divide & Conquer
Approach 1: Min-Heap
# Python
import heapq
def mergeKLists(lists):
heap = []
for i, node in enumerate(lists):
if node: heapq.heappush(heap, (node.val, i, node))
dummy = cur = ListNode(0)
while heap:
val, i, node = heapq.heappop(heap)
cur.next = node; cur = cur.next
if node.next: heapq.heappush(heap, (node.next.val, i, node.next))
return dummy.next
Approach 2: Divide & Conquer
# Python
def mergeKLists(lists):
def merge(l1, l2):
dummy = cur = ListNode(0)
while l1 and l2:
if l1.val <= l2.val: cur.next = l1; l1 = l1.next
else: cur.next = l2; l2 = l2.next
cur = cur.next
cur.next = l1 or l2
return dummy.next
if not lists: return None
while len(lists) > 1:
merged = []
for i in range(0, len(lists), 2):
l1 = lists[i]
l2 = lists[i+1] if i+1 < len(lists) else None
merged.append(merge(l1, l2))
lists = merged
return lists[0]
// Java — heap
public ListNode mergeKLists(ListNode[] lists) {
PriorityQueue<ListNode> heap = new PriorityQueue<>((a,b)->a.val-b.val);
for (ListNode node : lists) if (node != null) heap.offer(node);
ListNode dummy = new ListNode(0), cur = dummy;
while (!heap.isEmpty()) {
ListNode node = heap.poll();
cur.next = node; cur = cur.next;
if (node.next != null) heap.offer(node.next);
}
return dummy.next;
}
Complexity
- Heap: O(n log k) time, O(k) space
- D&C: O(n log k) time, O(log k) space
Advertisement