【每天学习一点算法 2026/05/10】合并K个排序链表

每天学习一点算法 2026/05/10

题目:合并K个排序链表

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

最简单的办法就是一个一个的合并链表即可,具体做法就是新建一个链表作为合并结果链表表头,维护两个指针指向两个链表的表头,比较指针对应节点的 val ,将较小值作为合并结果的下一个节点,并移动指针。

typescript 复制代码
function mergeKLists(lists: Array<ListNode | null>): ListNode | null {
  // 链表合并方法
  function mergeTwoLists (listA: ListNode | null, listB: ListNode | null) {
    // 当合并的其中一个链表为空时,直接返回另一个链表
    if (!listA || !listB) return listA ? listA : listB
    const head =  new ListNode(0) // 新建一个链表
    let tail = head // 合并结果指针, 初始指向 head
    // 当合并的两个链表都还有剩余节点时循环
    while (listA && listB) {
      // 比较两个链表当前节点值大小
      if (listA.val > listB.val) {
        tail.next = listB
        listB = listB.next
      } else {
        tail.next = listA
        listA = listA.next
      }
      // 更新合并节点指针
      tail = tail.next
    }
    // 当某一个链表合并完毕,处理剩余节点
    tail.next = listA ? listA : listB
    // 返回合并后链表表头
    return head.next
  }

  let res = null
  // 合并所有链表
  for (let i = 0; i < lists.length; i++) {
    res = mergeTwoLists(res, lists[i])
  }

  return res
};

针对上面的方法我们可以做一下优化,我们可以利用的分治的思想,将链表两两配对合并,得到的结果再两两配对合并直至只剩一个链表,这里我们利用递归来实现。

typescript 复制代码
function mergeKLists(lists: Array<ListNode | null>): ListNode | null {
  function mergeTwoLists (listA: ListNode | null, listB: ListNode | null) {
    if (!listA || !listB) return listA ? listA : listB
    const head =  new ListNode(0)
    let tail = head
    while (listA && listB) {
      if (listA.val > listB.val) {
        tail.next = listB
        listB = listB.next
      } else {
        tail.next = listA
        listA = listA.next
      }
      tail = tail.next
    }
    tail.next = listA ? listA : listB
    return head.next
  }
  // 合并方法
  function merge (lists: Array<ListNode | null>, left: number, right: number): ListNode {
    if (left === right) return lists[left] // 两指针相遇返回所指的链表
    if (left > right) return null // 超出边界返回 null
    const mid = Math.floor((left + right) / 2) // 取中间值进行分治
    // 递归合并分组合并结果
    return mergeTwoLists(merge(lists, left, mid), merge(lists, mid + 1, right))
  }

  return merge(lists, 0, lists.length - 1)
};

题目来源:力扣(LeetCode)

相关推荐
GEO从入门到精通8 小时前
课程怎么选?2026年GEO学习资源全梳理
学习
优化Henry9 小时前
LTE 载波频率与频点配置详解
运维·网络·学习·5g·信息与通信
小蒋学算法9 小时前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法
xiaomu001239 小时前
高湿环境床垫湿度管理技术框架:湿度阈值、排湿结构与材料选型
经验分享·学习·学习方法
荆棘鸟智能9 小时前
林业遥感长势评估怎么做?从NDVI时序分析到LiDAR蓄积量回归
人工智能·算法·智慧林业
zhangrelay9 小时前
ROS项目设计案例智能大模型正经乱答案例
linux·笔记·学习·ubuntu·机器人
probex_10 小时前
学习笔记:知识图谱是什么,在测试里能干什么
笔记·学习·知识图谱
hhb_61810 小时前
AIRAGDebug:一键定位RAG链路异常
人工智能·python·算法
朝朝辞暮i10 小时前
C++ 第 6 课:switch —— 多状态选择
开发语言·c++·算法
苏打豆11 小时前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人