题目链接
题目描述
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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 = = l i s t s . l e n g t h k == lists.length k==lists.length
- 0 < = k < = 1 0 4 0 <= k <= 10^4 0<=k<=104
- 0 < = l i s t s [ i ] . l e n g t h < = 500 0 <= lists[i].length <= 500 0<=lists[i].length<=500
- − 1 0 4 < = l i s t s [ i ] [ j ] < = 1 0 4 -10^4 <= lists[i][j] <= 10^4 −104<=lists[i][j]<=104
- l i s t s [ i ] lists[i] lists[i] 按 升序 排列
- l i s t s [ i ] . l e n g t h lists[i].length lists[i].length 的总和不超过 1 0 4 10^4 104
解法一:迭代 & 递归
我们直接使用 21.合并两个有序链表的代码
依次的合并 k k k 个有序链表,最后直接返回即可。
时间复杂度: O ( k × ( m + n ) ) O(k \times (m + n)) O(k×(m+n)), m m m 和 n n n 是合并的两个链表的长度
C++代码:
/**
* 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* merge(ListNode* a , ListNode* b){
if(a == nullptr || b == nullptr){
return a == nullptr ? b : a;
}
if(a->val <= b->val){
a->next = merge(a->next,b);
return a;
}
else{
b->next = merge(a,b->next);
return b;
}
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* cur = nullptr;
for(auto &node:lists){
cur = merge(cur,node);
}
return cur;
}
};
解法二:分治 & 递归
时间复杂度: O ( k × n × l o g k ) O(k \times n \times logk) O(k×n×logk)
C++代码:
/**
* 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* merge(int l,int r,vector<ListNode*> lists){
if(l == r) return lists[l];
int mid = (l + r) >> 1;
ListNode* a = merge(l , mid , lists);
ListNode* b = merge(mid + 1 , r , lists);
return merge_list(a,b);
}
ListNode* merge_list(ListNode* a , ListNode* b){
if(a == nullptr || b == nullptr){
return a == nullptr ? b : a;
}
if(a->val <= b->val){
a->next = merge_list(a->next,b);
return a;
}
else{
b->next = merge_list(a,b->next);
return b;
}
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size() == 0) return nullptr;
int n = lists.size();
return merge(0 , n - 1 ,lists);
}
};