力扣23 合并k个升序链表

5 阅读1分钟

思路:

  • 本题要求将k个升序的链表合并成一个
  • 第一想法是遍历链表数组,找到所有头节点最小的节点,再找第二小的节点,直到按顺序找到所有节点
  • 第二想法是链表数组第一个和第二个合并,这个整体再和第三个合并,直到合并最后一个
  • 但是更快的方法是链表数组第一个和第二个合并,第三个和第四个合并...第一轮结束个数减半,后面每一轮都减半,直到只剩一个链表

代码:

  • 遍历整个数组奇数下标
  • 合并该位置和下一位的链表,新链表的指针要在链表头处
  • 收集这一轮的新链表
  • 重复这个过程直到新链表只剩一个,则该链表就是结果
  • 增加边界条件的判断
var mergeKLists = function (lists) {
    let temp = []
    if (lists.length === 0) {
        return null
    }
    while (lists.length > 1) {
        for (let i = 0; i < lists.length; i += 2) {
            let l1 = lists[i]
            let l2 = i + 1 < lists.length ? lists[i + 1] : null
            let sum = merge2Lists(l1, l2)
            temp.push(sum)
        }
        lists = temp
        temp = []
    }
    return lists[0]
};

function merge2Lists(l1, l2) {
    let dummy = new ListNode()
    let cur = dummy
    while (l1 && l2) {
        if (l1.val < l2.val) {
            cur.next = l1
            l1 = l1.next
        } else {
            cur.next = l2
            l2 = l2.next
        }
        cur = cur.next
    }
    cur.next = l1 || l2
    return dummy.next
}