给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入: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
示例 2:
输入:lists = []
输出:[]
示例 3:
输入:lists = [[]]
输出:[]
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4
https://leetcode-cn.com/problems/merge-k-sorted-lists/
/**
* 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* a,ListNode* b){//合并两个有序的链表
ListNode head;//设置头结点
ListNode* headpre=&head;//设置对应的指针
while(a&&b){
if(a->val<b->val){
headpre->next=a;
a=a->next;
}else{
headpre->next=b;
b=b->next;
}
headpre=headpre->next;
}
if(a){
headpre->next=a;
}
if(b){
headpre->next=b;
}
return head.next;//返回头结点的下一个结点对象
}
ListNode* mergeKLists(vector<ListNode*>& lists) {//利用分制的思想进行递归排序
if(lists.size()==0){
return nullptr;
}
if(lists.size()==1){
return lists[0];
}
if(lists.size()==2){
return mergeTwoLists(lists[0],lists[1]);
}
vector<ListNode*> sub1;
vector<ListNode*> sub2;
int mid=lists.size()/2;
for(int i=0;i<mid;i++){
sub1.push_back(lists[i]);
}
for(int i=mid;i<lists.size();i++){
sub2.push_back(lists[i]);
}
ListNode* l1=mergeKLists(sub1);//对前半部分结点进行排序
ListNode* l2=mergeKLists(sub2);//对后半部分进行排序
return mergeTwoLists(l1,l2);
}
};