LC 0023 [H] Merge k Sorted Lists - ALawliet/algorithms GitHub Wiki

# O(nlogk)
from queue import PriorityQueue

class Solution:
    def mergeKLists(self, lists: List[ListNode]) -> ListNode:
      Q = PriorityQueue()
      dum = ListNode(-1)
        
      for head in lists:
        cur = head
        while cur:
          Q.put(cur.val)
          cur = cur.next
            
      cur = dum
      while Q.qsize(): # > 0, not Q.empty()
        cur.next = ListNode(Q.get())
        cur = cur.next
      
      return dum.next
# mergesort: O(nlogn)
class Solution:
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        if not lists: return 
        if len(lists) == 1: return lists[0]
        m = len(lists) // 2
        l = self.mergeKLists(lists[:m])
        r = self.mergeKLists(lists[m:])
        return self.merge(l, r)

    def merge(self, l, r): # merge 2 sorted lists
        dum = ListNode(-1)
        cur = dum

        while l and r:
            if l.val < r.val:
                cur.next = l
                l = l.next
            else:
                cur.next = r
                r = r.next
            cur = cur.next

        cur.next = l or r

        return dum.next