Merge K Sorted Lists — Min-Heap or Divide and Conquer

Sanjeev SharmaSanjeev Sharma
2 min read

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

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro