合并K个升序链表要拆解成多个合并两个升序链表。 下面这种写法的时间复杂度还是很高的,如果需要优化,就采用分治的方法(递归)。每次取两个链表合并,变成树形结构,这样时间复杂度要比从头到尾遍历vector要好很多。logn VS n。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode * mergeTwoLists(ListNode *ans, ListNode* list)
{
if(ans==nullptr) return list;//针对第一次调用这个函数
if(list==nullptr) return ans;//针对最后一次调用
ListNode head;
ListNode *tail=&head;
ListNode *p=ans;
ListNode *q=list;
while(p&&q)
{
if(p->val<q->val)
{
tail->next=p;
p=p->next;
}
else
{
tail->next=q;
q=q->next;
}
tail=tail->next;
}
tail->next=(q?q:p);
return head.next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode *ans=nullptr;//这里用List *ans=new ListNode; ListNode *p=ans;会出现很多问题,暂时想不明白。
for(int i=0;i<lists.size();++i)
{
ans=mergeTwoLists(ans,lists[i]);
}
return ans;
}
};