题解 | #合并k个已排序的链表#

合并k个已排序的链表

https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

/*class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param lists ListNode类一维数组 
 * @return ListNode类
 */
export function mergeKLists(lists: ListNode[]): ListNode {
    // write code here
  let start = 0
  let end = lists.length - 1
  /**
  * 用类似归并排序的方式,拆分lists数组,以实现两两链表的合并
  */
  const recur = (start, end) => {
    if (start > end) {
      return null
    }
    if (start === end) {
      return lists[start]
    }
    const mid = Math.floor((start + end) / 2)
    let left = recur(start, mid)
    let right = recur(mid + 1, end)
	// 为了方便调整指针,用一个空的前置节点
    let lp: ListNode = new ListNode(-1, null)
    lp.next = left
    let rp: ListNode = new ListNode(-1, null)
    rp.next = right
    let head: ListNode = null
    let tail: ListNode

    // 处理只有lp.next为空,或者rp.next为空的情况
    if (!lp.next) {
      head = rp.next
      return head
    } else if (!rp.next) {
      head = lp.next
      return head
    }
    
    while (lp.next && rp.next) {
      let smaller
      let leftSmaller
      if (lp.next.val <= rp.next.val) {
        smaller = lp.next
        leftSmaller = true
      } else {
        smaller = rp.next
        leftSmaller = false
      }

      if (!head) {
        head = smaller
      } else {
        tail.next = smaller
      }
      tail = smaller
      if (leftSmaller) {
        lp.next = lp.next.next
      } else {
        rp.next = rp.next.next
      }      
    }
	// lp.next 或者 rp.next还有剩余节点则直接连进tail.next
    if (lp.next) {
      tail.next = lp.next
    } else if (rp.next) {
      tail.next = rp.next
    }
    return head
  }

  return recur(start, end)
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-01 17:13
想去,但是听说加班强度实在难崩,所以拒绝了,现在有点心梗对面hr感觉也是实习生,打电话的时候怪紧张的,但是感觉人很好嘞
水中水之下水道的鼠鼠:哥们这不先去体验一下,不行再跑呗,大不了混个实习经历(有更好的转正offer就当我没说)
点赞 评论 收藏
分享
点赞 评论 收藏
分享
05-09 12:23
已编辑
华南理工大学 Java
野猪不是猪🐗:给他装的,双九+有实习的能看的上这种厂我直接吃⑨✌们拿它练练面试愣是给他整出幻觉了
点赞 评论 收藏
分享
牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 17:37
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务