LeetCode 热题 HOT — 合并K个升序链表

82 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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.length
  • 0 <= k <= 10410^4
  • 0 <= lists[i].length <= 500
  • 104-10^4<= lists[i][j] <=10410^4
  • lists[i]升序 排列
  • lists[i].length 的总和不超过 10410^4

思路分析

  1. 因为对数组的操作比较熟悉,因此总是会把链表类型的问题转换成数组来解决;
  2. 定义一个 list2Arr 方法,将链表转换成数组;
  3. 先将 lists 中的每一项链表都转换成数组,并且整合到一个大数组 arr 中;
  4. arr 有可能为空,所以需要判断边界条件,在 arr.length === 0 时,返回 null;「因为这个边界值的处理,导致三次提交都不能通过」
  5. 然后将大数组 arr 进行升序排列;
  6. 最后将 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

END