题目
解法一
优先级队列
思想
将每个链表中的一个节点存放到优先级队列中,本题采用小根堆,将小根堆中的根节点取出,插入到最终的链表中,并且将该节点在原链表中的下一个节点插入小根堆中(需要向下调整),直到堆中没有节点为止(即所以链表都已经合并完)。
代码
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;}}
};