题目:https://leetcode.com/problems/merge-k-sorted-lists/#/description
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
分析:
合并k个有序链表,其本质就是合并2个有序链表(用递归代码会更简洁),然后作k-1次就可以了。如果每次合并的链表是最短的,那应该时间最短,这个可以用小根堆实现(我的版本没有实现这个优化)。
c++实现:
class Solution {
public:
ListNode* mergeTwoLists(ListNode *l1, ListNode *l2)
{
if(l1==NULL && l2==NULL)
return NULL;
ListNode head(1);
ListNode *p = &head;
while(l1!=NULL && l2!=NULL)
{
if(l1->val < l2->val)
{
p->next = l1;
p = p->next;
l1 = l1->next;
}
else
{
p->next = l2;
p = p->next;
l2 = l2->next;
}
p->next = NULL;
}
if(l1!=NULL)
p->next = l1;
else
p->next = l2;
return head.next;
}
ListNode* mergeKLists(vector<ListNode*>& lists)
{
if(lists.size()==0)
return NULL;
while(lists.size()>1)
{
lists.push_back(mergeTwoLists(lists[0],lists[1]));
lists.erase(lists.begin());
lists.erase(lists.begin());
}
return lists[0];
}
};
合并两个链表的递归版
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(l1, l2->next);
return l2;
}
}