合并k个已排序的链表
- 给了k个升序的链表,然后将它们合并成一个链表。
- 解题思路:
- 优先队列:使用合并两个排序链表的思路,将k个链表的非空头结点都加入优先队列当中,取出最小的节点,加入到已排序节点,并将对应链表的的头结点后移。直到优先队列为空。
- 归并排序的方法:使用归并的思想一致分治,然后从下至上两两合并链表。
代码
class Solution {
public:
struct cmp{
bool operator() (ListNode* first,ListNode* second){
return first->val>second->val;
}
};
ListNode *mergeKLists(vector<ListNode *> &lists) {
priority_queue<ListNode*,vector<ListNode*>,cmp> keep;
for(auto node:lists){
if(node!=nullptr){
keep.push(node);
}
}
ListNode* temp=new ListNode(-1);
ListNode* last=temp;
while(!keep.empty()){
last->next=keep.top();
last=last->next;
if(keep.top()->next){
keep.push(keep.top()->next);
}
keep.pop();
}
return temp->next;
}
};
class Solution {
public:
ListNode* merge(ListNode* first,ListNode* second){
ListNode* temp=new ListNode(-1);
ListNode* last=temp;
while(first && second){
if(first->val<second->val){
last->next=first;
first=first->next;
}
else{
last->next=second;
second=second->next;
}
last=last->next;
}
if(first){
last->next=first;
}
if(second){
last->next=second;
}
return temp->next;
}
ListNode* mergelist(vector<ListNode*>& lists,int left,int right){
if(right-left<=0){
return lists[left];
}
int mid=left+(right-left)/2;
ListNode* leftlist=mergelist(lists,left,mid);
ListNode* rightlist=mergelist(lists,mid+1,right);
return merge(leftlist,rightlist);
}
ListNode *mergeKLists(vector<ListNode *> &lists) {
if(lists.size()==0){
return nullptr;
}
int left=0,right=lists.size()-1;
return mergelist(lists,left,right);
}
};