[路飞][LeetCode]23_合并K个升序链表

175 阅读1分钟

「这是我参与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.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[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
};

谁不是青春时抱着理想南来北往,中年时抱着自己感慨岁月无常。

如有任何问题或建议,欢迎评论区留言讨论!