堆的應用---合併K個排序鏈表

23. 合併K個排序鏈表

合併 k 個排序鏈表,返回合併後的排序鏈表。請分析和描述算法的複雜度。

示例:

輸入:
[
  1->4->5,
  1->3->4,
  2->6
]
輸出: 1->1->2->3->4->4->5->6

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-k-sorted-lists
 

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution(object):
    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """
        import heapq
        heap = []
        for i, head in enumerate(lists):
            if head:
                heapq.heappush(heap, (head.val, i, head))  # 注意這個i很重要
                
        node = dummy = ListNode(0)
        while heap:
            val, i, cur_node = heapq.heappop(heap)
            node.next = ListNode(val)
            node = node.next
            if cur_node.next:
                heapq.heappush(heap, (cur_node.next.val, i, cur_node.next))
        return dummy.next

注意:如果不存儲i,heap會報錯

如果兩個或多個列表具有相同的val,則此代碼將出錯,因爲隊列模塊將比較優先級隊列中的第二個元素,該元素是ListNode對象(這不是可比較的類型)。

爲了解決這個問題,存儲了(node.val,list_idx,node)來解決這種情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章