题解 | #合并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)
}

全部评论

相关推荐

02-12 00:59
已编辑
哈尔滨工业大学 产品经理
华为 软件开发岗 20.6*16薪 本科
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务