合併 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)來解決這種情況。