🧩Algo 链表
23. 合并 K 个升序链表
难度:🔴 Hard | 标签:链表、堆、分治 | 状态:⬜ LeetCode 链接
思路
优先队列(小顶堆):把每个链表头放进堆,每次弹出最小的接到结果,再把它的下一个推进堆。
也可分治两两合并,O(n log k) 同阶。
代码
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
auto cmp = [](ListNode* a, ListNode* b) { return a->val > b->val; };
priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> pq(cmp);
for (auto* h : lists) if (h) pq.push(h);
ListNode dummy(0), *tail = &dummy;
while (!pq.empty()) {
auto* p = pq.top(); pq.pop();
tail->next = p; tail = p;
if (p->next) pq.push(p->next);
}
return dummy.next;
}
};
复杂度
- 时间 O(N log k),N 是总节点数
- 空间 O(k)
易错 / 回顾
- 比较函数
>表示小顶堆(C++ 反着写) - 入堆前判 nullptr,否则 deref 崩
- 两两合并 + 分治也是 O(N log k),但实现细节更多
Related · 链表