一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 7 天,点击查看活动详情。
合并K个升序链表
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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.length0 <= k <=0 <= lists[i].length <= 500<= lists[i][j] <=lists[i]按 升序 排列lists[i].length的总和不超过
思路分析
- 因为对数组的操作比较熟悉,因此总是会把链表类型的问题转换成数组来解决;
- 定义一个
list2Arr方法,将链表转换成数组; - 先将
lists中的每一项链表都转换成数组,并且整合到一个大数组arr中; arr有可能为空,所以需要判断边界条件,在arr.length === 0时,返回null;「因为这个边界值的处理,导致三次提交都不能通过」- 然后将大数组
arr进行升序排列; - 最后将
arr转换成链表ListNode返回即可。
AC 代码
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode[]} lists
* @return {ListNode}
*/
var mergeKLists = function(lists) {
let arr = []
lists.forEach(item=>{
if(item)
arr = arr.concat(list2Arr(item))
})
if(arr.length === 0) return null
arr.sort((a, b) => a - b)
let res = new ListNode(arr[0])
let pre = res
for(let i = 1; i < arr.length; i++) {
const node = new ListNode(arr[i])
pre.next = node
pre = node
}
return res
};
var list2Arr = function(list) {
const res = []
while(list) {
res.push(list.val)
list = list.next
}
return res
}
结果:
- 执行结果: 通过
- 执行用时:124 ms, 在所有 JavaScript 提交中击败了48.00%的用户
- 内存消耗:48.7 MB, 在所有 JavaScript 提交中击败了10.16%的用户
- 通过测试用例:133 / 133