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