代码思路:
用最小堆初始把所有链表的头节点入堆,然后不断弹出堆中最小节点x,如果x.next不为空就加入堆中,循环直到堆为空,把弹出的节点按顺序拼接起来,就得到答案。
ListNode.__lt__= lambda a,b:a.val<b.val # 让堆比较节点大小
class Solution:
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
cur = dummy = ListNode()# 哨兵节点,作为合并后链表头节点的前一个节点
h = [head for head in lists if head] # 初始把所有链表的头节点入堆
heapify(h)# 堆化
while h:# 循环直到堆为空
node = heappop(h)# 节点中的最小节点
if node.next:# 下一个节点不为空
heappush(h,node.next)# 下一个节点有可能是最小节点,入堆
cur.next = node # 合并到新链表中
cur = cur.next # 准备合并下一个节点
return dummy.next# 哨兵节点的下一个节点就是新链表的头节点