23. 合并 K 个升序链表题解

这道题一开始只能想到用这种方法来解,我推测应该是能过的,实际上确实能过。

结果如下:
执行用时:112 ms, 在所有 JavaScript 提交中击败了44.90%的用户
内存消耗:46.9 MB, 在所有 JavaScript 提交中击败了25.47%的用户
通过测试用例:
133 / 133

这道题要注意的是:

1. 输入和返回值的不同,这道题用例输入的数组,空数组的情况下,代码中要返回的却是null
2. 因为是直接解的,所以有很多边界条件需要处理,比如寻找第一个有序序列时的边界条件
3. 先解构ListNode对象,使其变成数组,再由数组转变成ListNode对象,应该是很耗时的,这个应该优化,如果要优化,直接解法应该是行不通的

力扣

/**
 * 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) {
    if (!lists || lists.length === 0) {
    return null
  }

  if (lists.length === 1) {
    return lists[0]
  }

  // 置入第一个有序序列
  const orignArr = []
  let firstListNode
  let index = 0
  for (; index < lists.length; index++) {
    firstListNode = lists[index]
    if (firstListNode instanceof ListNode && firstListNode !== null) {
      break
    }
  }
  if(!firstListNode) {
      return null
  }
  while (firstListNode.next !== null) {
    orignArr.push(firstListNode.val)
    firstListNode = firstListNode.next
  }
  orignArr.push(firstListNode.val)

  let getCorrectPosition = function (orignArr, target) {
    let low = 0
    let high = orignArr.length - 1
    let findFlag = false

    while (low <= high) {
      let mid = (low + high) >>> 1
      if (orignArr[mid] === target) {
        findFlag = true
        orignArr.splice(mid + 1, 0, target)
        break
      } else if (orignArr[mid] < target) {
        low = mid + 1
      } else if (orignArr[mid] > target) {
        high = mid - 1
      }
    }
    if (!findFlag) {
      orignArr.splice(high + 1, 0, target)
    }
  }

  for (let i = index + 1; i < lists.length; i++) {
    let element = lists[i]
    if(element === null) {
      continue
    }

    while (element.next !== null) {
      getCorrectPosition(orignArr, element.val)
      element = element.next
    }
    getCorrectPosition(orignArr, element.val)
  }

  // 构造链表
  let buildLinkTable = function (orignArr, i) {
    if (i === orignArr.length - 1) {
      return new ListNode(orignArr[i])
    }

    return new ListNode(orignArr[i], buildLinkTable(orignArr, ++i))
  }

  const result = buildLinkTable(orignArr, 0)
  return result
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值