给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例1:
1 | 输入:lists = [[1,4,5],[1,3,4],[2,6]] |
示例2:
1 | 输入:lists = [] |
示例3:
1 | 输入:lists = [[]] |
前置知识:需要对合并两个有序链表的解法有一定的理解和掌握:可参考21题
题解方法一:顺序合并
解题思路:
- 1、用一个变量ans来维护以及合并的链表,
- 2、第i次循环把第i个链表和ans合并,答案保存到ans中。
⚠️:只要对合并两个有序链表的解法有一定的理解和掌握,第一种解题思路很容易理解,此处不进行图解分析,直接展示代码实现。
代码实现如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23var mergeKLists = function(lists) {
let ans = null;
for (let i = 0; i< lists.length; i++){
ans = mergeTwoLists(ans, lists[i])
}
return ans;
};
// mergeTwoLists 这个方法就是合并两个有序链表的解法
var mergeTwoLists = function(l1, l2) {
if (l1 === null){
return l2
} else if (l2 === null){
return l1
}
if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2)
return l1
} else {
l2.next = mergeTwoLists(l1, l2.next)
return l2
}
};
复杂度分析:(时间复杂度和空间复杂度需要重新理解,待整理)
题解方法二:分治合并
1 |
|
接下来我们以示例1
const lists = [[1,4,5],[1,3,4],[2,6],[4,6,7,8],[2,3,7,8],[3,5,7,8]]
下面通过代码拆分解析如下:
1 | var mergeKLists = function(lists) { //第1步:lists = [[1,4,5],[1,3,4],[2,6],[4,6,7,8],[2,3,7,8],[3,5,7,8]] |
参考链接: