[23] 合并 K 个升序链表

复制代码
/**
 * 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) {
  var ll = lists.length;
  if (ll === 1) {
    return lists[0];
  }
  return dfs(lists, 0, lists.length - 1)
};
var dfs = function (lists, l, r) {
  if (l === r) {
    return lists[l]
  }
  if (l > r) {
    return null
  }
  let mid = (l + r) >> 1
  return mergeTwoLists(dfs(lists, l, mid), dfs(lists, mid + 1, r))

}
var mergeTwoLists = function (list1, list2) {
  if (!list1) {
    return list2
  }
  if (!list2) {
    return list1
  }
  // 定义一个空的链表
  let res = new ListNode(-1);
  // 复制该链表,因为迭代过程中会改变链表
  let ans = res;
  // 迭代结束条件为当一个链表遍历结束即停止
  while (list1 && list2) {
    // 当list1节点大,则先指向list2 节点
    if (list1.val >= list2.val) {
      res.next = list2;
      // 同时改变 list2 指针为下一个继续对比
      list2 = list2.next;
    } else {
      res.next = list1;
      list1 = list1.next;
    }
    // 每次迭代,改变当前链表的指向,以进行正确指向
    res = res.next;
  }
  // 最后迭代结束后,可能会有一个链表还有剩余,且由于是递增的,所以直接等于剩余的链表头节点即可
  res.next = list1 ? list1 : list2;
  // 返回空节点的下一个即为最终的结果
  return ans.next;
};
复制代码

 

posted @   人恒过  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示