合并 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)来解决这种情况。