「这是我参与2022首次更文挑战的第35天,活动详情查看:2022首次更文挑战」
看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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 <= 10^40 <= lists[i].length <= 500-10^4 <= lists[i][j] <= 10^4lists[i]按 升序 排列lists[i].length的总和不超过10^4
解题思路
- 我们可以先将数组进行遍历
- 针对遍历到的每一个链表,我们去除其中每项的值存入新的数组中
- 对数组中的值按升序进行排序
- 定义一个虚拟头节点
- 遍历用于存节点值的数组,将每次取到的值用于新建节点
- 将新创建的节点作为头结点的下一项,并将头结点后移
- 最后将虚头头结点的下一项作为结果返回
需要注意的是:
lists中给的为链表,无法通过flat进行扁平化处理!!!
解题代码
/**
* 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) {
const arr = []
for(let i =0;i<lists.length;i++){
let node = lists[i]
while(node){
arr.push(node.val)
node = node.next
}
}
arr.sort((a,b)=> a-b)
let res = new ListNode(-1)
let node = res
for(let val of arr){
node.next = new ListNode(val)
node = node.next
}
return res.next
};
谁不是青春时抱着理想南来北往,中年时抱着自己感慨岁月无常。
如有任何问题或建议,欢迎评论区留言讨论!