主页有其他数据结构内容(持续更新中)
难度:Hard
代码:
用优先队列可以很好地解决此类问题
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
struct cmp{
// 重写仿函数
bool operator()(ListNode* l1, ListNode* l2){
return l1->val > l2->val;
// 这里用>的含义:如果l1->val>l2->val(返回true),那么就进行下沉操作;返回false就不改变
// 我们的目标是建立一个头部最小的堆
// 优先队列的源码使用数组实现,array[0]是堆顶,必须使大的数不断下沉
// 根据所有链表的头结点的比较结果,可以确保优先队列的队头是最小的
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*, vector<ListNode*>, cmp> pq;
for(ListNode* temp : lists){
if(temp){
pq.push(temp);
}
}
// new一个头节点
ListNode* dummy = new ListNode();
ListNode* current = dummy;
while(!pq.empty()){
current->next = pq.top(); // 指向当前队列顶部结点,也就是最小元素
pq.pop(); // 把当前结点出队
current = current->next;
if(current->next){
// 如果当前结点存在后继结点,使之入队,继续完成后续比较
pq.push(current->next);
// 每次在插入新结点之后,priority_queue都会按照排序规则自动进行一次排序
}
}
return dummy->next;
}
};