题目要求
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
题解
https://github.com/soulmachine/leetcode
直接复用mergeTwoLists。
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0) return nullptr;
ListNode *p=lists[0];
for(int i=1;i<lists.size();i++){
p=mergeTwoLists(p,lists[i]);
}
return p;
}
ListNode* mergeTwoLists(ListNode *l1,ListNode *l2){
ListNode head(-1);
for(ListNode* p=&head;l1!=nullptr||l2!=nullptr;p=p->next){
int val1=l1==nullptr?INT_MAX:l1->val;
int val2=l2==nullptr?INT_MAX:l2->val;
if(val1<=val2){
p->next=l1;
l1=l1->next;
}
else{
p->next=l2;
l2=l2->next;
}
}
return head.next;
}
};
执行用时 | 内存消耗 |
---|---|
320 ms | 10.8 MB |
纯递归法
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0) return nullptr;
ListNode *p=lists[0];
for(int i=1;i<lists.size();i++){
p=mergeTwoLists(p,lists[i]);
}
return p;
}
ListNode* mergeTwoLists(ListNode *l1,ListNode *l2){
if(l1==nullptr)
return l2;
if(l2==nullptr)
return l1;
if(l1->val<l2->val){
l1->next=mergeTwoLists(l1->next,l2);
return l1;
}else{
l2->next=mergeTwoLists(l2->next,l1);
return l2;
}
}
};
执行用时 | 内存消耗 |
---|---|
300 ms | 11.4 MB |