23. 合并 K 个升序链表
https://leetcode.cn/problems/merge-k-sorted-lists/?envType=study-plan-v2&envId=top-interview-150
思路
K个升序链表,依据显然的规则:
当前最小的值,肯定出自于K个升序链表的K个表头中,
对这K个表头使用最小堆(priority_queue)进行管理,pop出的堆顶值,就是当前最小值
剩下 K-1 表头在堆中, 将 当前最小值所有链表 的 第二小 元素 入堆,
继续求第二小值
。。。。。。
Code
/** * 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) {} * }; */ struct QNODE{ int val; ListNode* node; bool operator < (const QNODE &qnode) const{ return val > qnode.val; } }; class Solution { public: ListNode* mergeKLists(vector<ListNode*>& lists) { priority_queue <QNODE> pq; for(auto one: lists){ if (one){ pq.push({one->val, one}); } } ListNode head, *tail = &head; while(!pq.empty()){ QNODE top = pq.top(); pq.pop(); tail->next = top.node; tail = tail->next; if (top.node->next){ pq.push({top.node->next->val, top.node->next}); } } return head.next; } };
优先队列
https://zhuanlan.zhihu.com/p/355974733
https://www.cnblogs.com/shona/p/12163381.html
注意最小堆和最大堆的原型差异
//升序队列 小顶堆 great 小到大 priority_queue <int,vector<int>,greater<int> > pq;//升序 //降序队列 大顶堆 less 大到小 默认 priority_queue <int,vector<int>,less<int> > pq;//降序
标签:pq,ListNode,val,23,top,next,链表,升序 From: https://www.cnblogs.com/lightsong/p/18180765