https://leetcode-cn.com/problems/merge-k-sorted-lists/
思路一:暴力,每次取最小值加入链表中。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode *root=new ListNode(0);
ListNode *cur=root;
int len=lists.size();
while(1){
bool tag=0;
int ans,idx;
for(int i=0;i<len;i++){
if(lists[i]!=NULL){
if(!tag)
ans=lists[i]->val,idx=i;
else if(lists[i]->val<ans)
ans=lists[i]->val,idx=i;
tag=1;
}
}
if(!tag)
break;
cur->next=lists[idx];
lists[idx]=lists[idx]->next;
cur=cur->next;
}
cur=root->next;
delete(root);
return cur;
}
};
思路二:用优先队列加速上述过程。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode *root=new ListNode(0);
ListNode *cur=root;
auto cmp=[&](int a,int b){return lists[a]->val>lists[b]->val;};
priority_queue<int,vector<int>,decltype(cmp)> q(cmp);
int len=lists.size();
for(int i=0;i<len;i++)
if(lists[i]!=NULL)
q.push(i);
int tmp;
while(!q.empty()){
tmp=q.top();
q.pop();
cur->next=lists[tmp];
cur=cur->next;
lists[tmp]=lists[tmp]->next;
if(lists[tmp]!=NULL)
q.push(tmp);
}
cur=root->next;
delete(root);
return cur;
}
};