Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input: [ 1->4->5, 1->3->4, 2->6 ] Output: 1->1->2->3->4->4->5->6
思路
用priority queue。
python的priority queue有两个,一般用heapq就行。另一个Queue.PriorityQueue一般用于多线程的同步任务。
heapq.heapify(list) 把list转为heap。
然后后面加入就用heapq.heappush(list, 值)
删除就用heapq.heappop(list)
这里我们要把node放进去,但是实际想按照node.val排序。heapq没有key参数,只能用把(node.val, node)放进heapq的方式来调整我们的优先级。但是这样一来,如果node.val相同,就会比较node,由于node之间无法比较就会报错。为了打破平衡,就再中间加入一个平衡打破者(只要等打破平衡,不让他往后去比较node就行),这里就使用list的index,(node.val, i, node)。
代码
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
pairs = [(node.val, i, node) for i, node in enumerate(lists) if node]
heapq.heapify(pairs)
dummy = ListNode(0)
cur = dummy
while len(pairs) != 0:
value, i, node = heapq.heappop(pairs)
cur.next = node
cur = cur.next
if node.next:
heapq.heappush(pairs, (node.next.val, i, node.next))
return dummy.next