leetcode-23. 合并K个升序链表

本文最后更新于:2022年7月30日 晚上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
public:
// c++ 定义结构体,重载(),作为函数使用,使用优先队列实现小根堆
struct Cmp {
bool operator() (ListNode* a, ListNode* b)
{
// 小根堆
return a->val > b->val;
}
};

ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*, vector<ListNode*>, Cmp> heap;

auto dummy = new ListNode(0);
auto tail = dummy;

// 把k个链表的头节点放入小根堆中
for (auto l : lists)
if (l) heap.push(l);

while (heap.size())
{
// 取堆顶最小节点, 并弹出
auto t = heap.top();
heap.pop();

tail->next = t;
tail = t;

// 堆插入代价是 O(logk)
if (t->next) heap.push(t->next);
}

return dummy->next;
}
};