当前位置: 首页 > news >正文

【每日算法】合并两个有序链表 LeetCode

方法设计思路

  1. 目标:将两个有序链表合并为一个新的有序链表。
  2. 核心思想:通过双指针遍历两个链表,每次选择较小的节点连接到新链表,直到其中一个链表遍历完毕,然后将剩余链表直接连接到新链表尾部。
  3. 关键点
    • 使用虚拟头节点 ( head ) 简化边界条件处理。
    • 通过 cur 指针动态构建新链表。
    • 直接利用原链表的节点,避免额外的空间开销。

实现细节

/*** Definition for singly-linked list.* public class ListNode {*     public int val;*     public ListNode next;*     public ListNode(int val=0, ListNode next=null) {*         this.val = val;*         this.next = next;*     }* }*/public ListNode MergeTwoLists(ListNode list1, ListNode list2)
{// 1. 创建虚拟头节点,简化初始为空的情况ListNode head = new ListNode();ListNode cur = head;// 2. 遍历两个链表,直到其中一个为空while (list1 != null && list2 != null){// 3. 比较当前节点的值,选择较小的节点连接到新链表if (list1.val < list2.val){cur.next = list1;list1 = list1.next; // 移动 list1 指针}else{cur.next = list2;list2 = list2.next; // 移动 list2 指针}cur = cur.next; // 移动新链表的指针}// 4. 将剩余的非空链表直接连接到新链表尾部cur.next = list1 == null ? list2 : list1;// 5. 返回合并后的链表(跳过虚拟头节点)return head.next;
}
步骤解析
  1. 初始化

    • 创建一个虚拟头节点 head ,其 next 指针指向新链表的实际头节点。
    • cur 指针用于动态构建新链表。
  2. 遍历与比较

    • 比较 list1 和 list2 当前节点的值,将较小的节点连接到 cur.next 。
    • 移动较小节点所在链表的指针( list1 或 list2 )。
    • 移动 cur 指针到新链表的尾部。
  3. 处理剩余节点:当其中一个链表遍历完毕时,直接将另一个链表的剩余部分连接到 cur.next 。

  4. 返回结果:返回 head.next ,即新链表的实际头节点。

边界条件处理

  1. 一个链表为空:如果 list1 为空,直接返回 list2 (反之亦然)。在代码中通过 cur.next = list1 == null ? list2 : list1 实现。

  2. 两个链表均为空:返回 head.next (即 null ),符合预期。

  3. 虚拟头节点的作用:避免单独处理初始时 cur 为空的情况,简化代码逻辑。

复杂度分析

指标说明
时间复杂度O(n + m)需要遍历两个链表的所有节点,其中 n 和 m 分别为链表的长度。
空间复杂度O(1)仅使用常数级别的额外空间(虚拟头节点和指针变量)。

适用场景

  1. 有序链表的合并:适用于两个已经按升序排列的链表。可以扩展为合并多个有序链表(需调整逻辑)。

  2. 资源敏感场景:由于空间复杂度为 O(1),适合内存受限的环境。

  3. 稳定性要求:保持原有链表的相对顺序,适合需要稳定排序的场景。

方法优势

  1. 高效性:时间和空间复杂度均为最优。
  2. 简洁性:代码逻辑清晰,易于理解和维护。
  3. 通用性:可轻松扩展为其他类似问题(如合并多个链表)。

文章转载自:

http://7JB8op75.mnccq.cn
http://mdVvqnzq.mnccq.cn
http://VgxAxbKT.mnccq.cn
http://Ald97lrx.mnccq.cn
http://U7BNkPyt.mnccq.cn
http://drGTiX5K.mnccq.cn
http://dxrc3J4m.mnccq.cn
http://shf5iouy.mnccq.cn
http://SDOiNb01.mnccq.cn
http://ALI0kSSj.mnccq.cn
http://2DXis40T.mnccq.cn
http://2tWAeTSe.mnccq.cn
http://cD7g4t0o.mnccq.cn
http://JVjQBuLJ.mnccq.cn
http://g9lDKRut.mnccq.cn
http://sZtNPwK2.mnccq.cn
http://RYtmjLoz.mnccq.cn
http://HbchJJVh.mnccq.cn
http://DNBH1tYE.mnccq.cn
http://UwpHhPad.mnccq.cn
http://9h6KqMDx.mnccq.cn
http://Bs9w5D82.mnccq.cn
http://o1QkHtIu.mnccq.cn
http://3ceGjVNS.mnccq.cn
http://N71qDHKr.mnccq.cn
http://adlXBLZv.mnccq.cn
http://yPfVEFYe.mnccq.cn
http://3bYIKaVU.mnccq.cn
http://d8Whv3hw.mnccq.cn
http://XAICb8AA.mnccq.cn
http://www.dtcms.com/a/378308.html

相关文章:

  • 瑞萨RA家族新成员RA4C1,符合DLMS SUITE2表计安全规范、超低功耗、支持段码显示,专为智能表计应用开发
  • 【maxscript】矩阵对齐-武器残影
  • Java 黑马程序员学习笔记(进阶篇4)
  • XR 和 AI 在 Siggraph 2025 上主导图形的未来,获取gltf/glb格式
  • TikTok矩阵有哪些运营支撑方案?
  • 《基于深度学习的近红外条纹投影三维测量》-论文总结
  • 优选算法 100 题 —— 2 滑动窗口
  • MongoDB 在线安装-一键安装脚本(CentOS 7.9)
  • DeepSeek辅助编写的利用quick_xml把xml转为csv的rust程序
  • Rider中的Run/Debug配置对应的本地文件
  • 综合项目实践:基于基础语法核心的Python项目
  • 开始 ComfyUI 的 AI 绘图之旅-Flux.1图生图(八)
  • 供应商管理系统包含哪些模块?
  • MongoDB Atlas 云数据库实战:从零搭建全球多节点集群
  • Apache服务——搭建实验
  • “一半是火焰,一半是海水”,金融大模型的爆发与困局
  • 开源 C++ QT Widget 开发(十六)程序发布
  • MPC控制器C语言实现:基于一阶RL系统
  • C++版单例模式-现代化简洁写法
  • 强大的开源文档问答工具-Kotaemon
  • 音视频学习(六十三):AVCC和HVCC
  • 深度解析强化学习(RL):原理、算法与金融应用
  • 独立显卡和集成显卡切换电脑卡住了怎么办?
  • 加固笔记本是什么意思?加固笔记本图片
  • 光子精密3D线激光轮廓测量仪:赋能手机生产全流程质量与效率升级
  • springboot excel 表格入门与实战
  • react实现无缝轮播组件
  • DbGate数据库管理新方案:cpolar打造跨平台远程访问通道
  • Spark+Hive中间件
  • 【案例分享】TeeChart 助力 Softdrill 提升油气钻井数据可视化能力