链表-23. 合并K个升序链表

题目描述

image

测试样例

示例 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 = [[]]
输出:[]

示例代码:

/**
 * 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 h = lists ? lists.length : 0;
  if(h === 0) return null;
  if(h === 1) return lists[0];
    const  transform=(list, arr) =>{
        while(list) {
            arr.push(list.val);
            list = list.next;
        }
    }
    // 用于存储将每个节点的值
    let arr = [];
    lists.forEach(item => transform(item, arr));
    arr.sort((a, b) => a - b);
    // 创建虚拟头节点
    let head = new ListNode(-1);
    let p = head
    
    for(let i = 0;i<arr.length;i++) {
        let newNode = new ListNode(arr[i])
        p.next=newNode
        p= newNode
    }

    return head.next
};

代码说明

  • 遍历所有链表,将其节点的值添加到数组中
  • 对数组元素进行排序
  • 遍历数组生成链表

上述思路比较简单,但并不是明智之举,只是能够将问题解决,仅供参考。
需要注意的是对于边界的处理我们可以采用虚拟头节点的方式来解决

posted @ 2022-10-13 19:09  含若飞  阅读(15)  评论(0编辑  收藏  举报