题目描述:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
题目分析:
首先写一个将两个有序链表合并为一个链表的函数,使用此函数将lists中的所有链表依次合并到第一个链表当中。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* merge(ListNode*l1,ListNode*l2){ //将两个链表合并的函数
if(l1==NULL&&l2!=NULL){ //如果两个链表有一个为空,那么返回另外一个。如果都为空,返回NULL。
return l2;
}
else if(l1!=NULL&&l2==NULL){
return l1;
}
else if(l1==NULL&&l2==NULL){
return NULL;
}
ListNode*ans,*p;
if(l1->val<=l2->val){ //处理首节点
ans=l1;
l1=l1->next;
}
else{
ans=l2;
l2=l2->next;
}
p=ans;
while(l1!=NULL&&l2!=NULL){ //每次从两个链表中取出一个结点放到结果链表当中
if(l1->val<=l2->val){
p->next=l1;
l1=l1->next;
p=p->next;
}
else{
p->next=l2;
l2=l2->next;
p=p->next;
}
}
while(l1!=NULL){ //两个while只执行一个,将长的那个链表的剩余结点放到结果链表中
p->next=l1;
l1=l1->next;
p=p->next;
}
while(l2!=NULL){
p->next=l2;
l2=l2->next;
p=p->next;
}
p->next=NULL; //将链表的结尾置为NULL;
return ans;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0){ //如果lists为空,那么返回NULL;
return NULL;
}
ListNode*ans=lists[0];
for(int i=1;i<lists.size();i++){
ans=merge(ans,lists[i]); //处理所有的链表
}
return ans;
}
};