赞
踩
目录
将每个链表中的一个节点存放到优先级队列中,本题采用小根堆,将小根堆中的根节点取出,插入到最终的链表中,并且将该节点在原链表中的下一个节点插入小根堆中(需要向下调整),直到堆中没有节点为止(即所以链表都已经合并完)。
- class Solution {
- public:
- struct Less{
- bool operator()(ListNode* l1,ListNode* l2){
- return l1->val > l2->val;
- }
- };
-
- ListNode* mergeKLists(vector<ListNode*>& lists) {
- ListNode* node=new ListNode(0);
- ListNode* cur=node;
- priority_queue<ListNode*,vector<ListNode*>,Less> q;
- for(auto& it:lists){
- if(it) q.push(it);
- }
- while(!q.empty()){
- ListNode* tmp=q.top();
- q.pop();
- cur->next=tmp;
- if(tmp->next) q.push(tmp->next);
- cur=cur->next;
- }
- return node->next;
- }
- };
归并/分治
将链表两两进行合并,直到合并为一个链表为止。
- class Solution {
- public:
- ListNode* mergeKLists(vector<ListNode*>& lists) {
- return mergeL(lists,0,lists.size()-1);
- }
-
- ListNode* mergeL(vector<ListNode*>& lists,int l,int r){
- if(l>r) return nullptr;
- if(l==r) return lists[l];
- int mid=(l+r)>>1;
- ListNode* l1=mergeL(lists,l,mid);
- ListNode* l2=mergeL(lists,mid+1,r);
- return merge2L(l1,l2);
- }
-
- ListNode* merge2L(ListNode* l1,ListNode* l2){
- if(l1==nullptr) return l2;
- if(l2==nullptr) return l1;
- if(l1->val < l2->val){
- l1->next=merge2L(l1->next,l2);
- return l1;
- }
- else{
- l2->next=merge2L(l1,l2->next);
- return l2;
- }
- }
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。