23.合并K个排序链表
https://leetcode-cn.com/problems/merge-k-sorted-lists/
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
1.暴力法:
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
vector<int> res;
int len = lists.size();
for(int i=0;i<len;i++){
ListNode* cur=lists[i];
while(cur!=NULL){
res.push_back(cur->val);
cur = cur->next;
}
}
sort(res.begin(),res.end());
ListNode* point=new ListNode(0);
ListNode* head=point;
for(int i=0;i<res.size();i++){
point->next=new ListNode(res[i]);
point = point->next;
}
return head->next;
}
};
2.分治法
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
int len=lists.size();
if(len==0) return NULL;
int step=1;
while(step<len){
for(int i=0;i<len-step;i=i+step*2){
lists[i] = merge(lists[i],lists[i+step]);
}
step=step*2;
}
return lists[0];
}
ListNode* merge(ListNode* l1,ListNode* l2){
ListNode* point=new ListNode(0);
ListNode* head=point;
while(l1&&l2){
if(l1->val<=l2->val){
point->next=l1;
l1=l1->next;
}
else{
point->next=l2;
l2=l2->next;
}
point = point->next;
}
if(l1) point->next=l1;
if(l2) point->next=l2;
return head->next;
}
};