#23
Hard
堆 / 优先队列

Merge k Sorted Lists

合并 k 个有序链表。

Linked ListHeap

题目定位

每一步只需要知道 k 个链表当前头结点里最小的那个,因此堆就是最自然的前沿结构。

关键观察

堆里不需要整条链表,只需要每条尚未结束链表的当前头结点。

目标复杂度

O(n log k) / O(k)

这题的解法思路怎么拆

1

每一步只需要知道 k 个链表当前头结点里最小的那个,因此堆就是最自然的前沿结构。

2

堆里不需要整条链表,只需要每条尚未结束链表的当前头结点。

3

先用一句话说明堆顶代表什么。

4

新候选者一旦合格就立刻入堆。

参考实现

Python
# Generic pattern template
import heapq

heap = []
heapq.heappush(heap, value)
smallest = heapq.heappop(heap)

# max heap in Python
heapq.heappush(heap, -value)
largest = -heapq.heappop(heap)

常见坑点

warning

没意识到堆比两两归并更直接。

warning

弹出一个头结点后忘了把它的 next 压回堆。

高频追问

和分治归并相比,这种写法优劣在哪里?

如果节点值相同,堆的比较键应该怎么处理?

继续刷相关题

先把 堆 / 优先队列 这个模式刷成体系,再去做更难变体。

view_week回到模式页
LeetCode 23. Merge k Sorted Lists 题解思路 | Interview AiBox