题目定位
每一步只需要知道 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 压回堆。
高频追问
和分治归并相比,这种写法优劣在哪里?
如果节点值相同,堆的比较键应该怎么处理?
继续刷相关题
先把 堆 / 优先队列 这个模式刷成体系,再去做更难变体。