给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
思路:分治法,两两合并。
List[0]和List[1]先合并,然后合并的结果再与List[2]合并,以此类推。
/**
* 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 *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* dummy=new ListNode(-1);
ListNode* p=dummy;
while(l1!=nullptr&&l2!=nullptr)
{
if(l1->val<=l2->val)
{
p->next=l1;
p=p->next;
l1=l1->next;
}
else
{
p->next=l2;
p=p->next;
l2=l2->next;
}
}
if(l1==nullptr)
{
p->next=l2;
}
if(l2==nullptr)
{
p->next=l1;
}
return dummy->next;
}
};