请用优先队列法将代码写出
时间: 2023-07-09 18:42:49 浏览: 82
另一种合并k个已排序链表的常见方法是使用优先队列。具体做法如下:
1. 将k个链表的头节点加入一个最小堆(优先队列),将堆顶节点取出,加入新链表中,并将堆顶节点的下一个节点加入最小堆。
2. 重复步骤1,直到最小堆为空。
下面是使用C++ STL中的priority_queue实现的代码:
```C++
struct compare {
bool operator()(const ListNode* l1, const ListNode* l2) {
return l1->val > l2->val;
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*, vector<ListNode*>, compare> pq;
for (auto l : lists) {
if (l) pq.push(l);
}
ListNode dummy(0);
ListNode* tail = &dummy;
while (!pq.empty()) {
ListNode* node = pq.top();
pq.pop();
tail->next = node;
tail = tail->next;
if (node->next) pq.push(node->next);
}
return dummy.next;
}
```
在优先队列中,我们定义了一个结构体compare,重载了()运算符,将val值较小的ListNode放在堆顶。每次取出堆顶节点,加入新链表中,并将堆顶节点的下一个节点加入堆中,直到堆为空。
阅读全文