版权声明: https://blog.csdn.net/Dorothy_Xue/article/details/83422030
题目描述:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
方法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* h0=NULL;
ListNode* fi;
if(lists.size()!=0)//删掉所有空表
for(int i=0;i<lists.size();i++)
if(lists[i]==NULL)
lists.erase(lists.begin()+i);
if(lists.size()==0) return h0;
if(lists.size()==1) return lists[0];
ListNode* flag=merge(lists[0],lists[1]);
if(lists.size()==2) return flag;
else
for(int i=2;i<lists.size();i++)
flag=merge(flag,lists[i]);
return flag;
}
ListNode* merge(ListNode* l1,ListNode* l2)
{
ListNode *h,*p,*q,*s,*t;
if(l1==NULL) return l2;
if(l2==NULL) return l1;
h=(struct ListNode*)malloc(sizeof(ListNode));
p=l1;q=l2;s=h;
while(p!=NULL&&q!=NULL)
{
if(p->val < q->val)
{
s->next=p;
p=p->next;
s=s->next;
continue;
}
if(p->val >= q->val)
{
s->next=q;
q=q->next;
s=s->next;
continue;
}
}
if(p==NULL&&q!=NULL) s->next=q;
if(q==NULL&&p!=NULL) s->next=p;
s=h->next;
return s;
}
};
思路:
首先删掉所有空表;然后对剩下的链表进行合并,从前往后依次合并(((1,2),3),4)......这种。这里合并时可以用之前的合并两个有序链表的方法:https://blog.csdn.net/Dorothy_Xue/article/details/83347027
在此之前尝试用过类似于二路归并的方法,但是在每次合并后,两个链表合二为一,lists中删掉一个节点后,vector下标有所变化,对之后的merge会产生影响,以至报错,经过数小时调试无果,遂放弃。