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

剑指offer-16、合并两个有序链表

题⽬描述

输⼊两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满⾜单调不减规则。

如输⼊{1,3,5} , {2,4,6} 时,合并后的链表为{1,2,3,4,5,6} ,所以对应的输出为{1,2,3,4,5,6} ,转换过程如下图所示:

思路及解答

迭代法(双指针)

使用两个指针分别遍历两个链表,比较当前节点的值,将较小的节点连接到结果链表上。当一个链表遍历完后,将另一个链表的剩余部分直接连接到最后。

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {// 创建哑节点作为合并后链表的头节点前驱ListNode dummy = new ListNode(-1);ListNode current = dummy;while (l1 != null && l2 != null) {if (l1.val <= l2.val) {current.next = l1;l1 = l1.next;} else {current.next = l2;l2 = l2.next;}current = current.next;}// 连接剩余部分current.next = (l1 != null) ? l1 : l2;return dummy.next;
}
  • 时间复杂度​:O(n+m),n和m分别是两个链表的长度
  • 空间复杂度​:O(1),只使用了固定数量的指针

递归比较

利用递归将问题分解:每次比较两个链表的头节点,选择较小的节点作为合并后链表的头节点,然后递归地合并剩余部分。

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {if (l1 == null) return l2;if (l2 == null) return l1;if (l1.val <= l2.val) {l1.next = mergeTwoLists(l1.next, l2);return l1;} else {l2.next = mergeTwoLists(l1, l2.next);return l2;}
}
  • 时间复杂度​:O(n+m),每个节点都会被访问一次
  • 空间复杂度​:O(n+m),递归调用栈的深度
http://www.vanclimg.com/news/1306.html

相关文章:

  • 区分引用变量和内表变量
  • 线程
  • 进程
  • 进程API函数
  • 〆250729〆Windows 系统中 C:\ProgramData 目录说明
  • .NET 10 中的新增功能系列文章1——运行时中的新增功能
  • cv2安装测试的一个案例-面部检测
  • gitlab重置管理员root密码
  • 线程API
  • 1000子读后感
  • Teamcenter: 度量单位
  • .NET 9 的免费午餐:GZip 性能提升38.3%
  • 暑假本校集训
  • 20250729-33
  • FHQ Treap 学习笔记
  • C#/.NET/.NET Core技术前沿周刊 | 第 48 期(2025年7.21-7.27)
  • Metasploit Pro 4.22.8-2025071801 (Linux, Windows) - 专业渗透测试框架
  • test的启动方法
  • Lombok @Builder失效问题排查与解决方案
  • 亚马逊Q Developer:用自然语言构建机器学习模型
  • day07
  • 读心与芯:我们与机器人的无限未来08计算思维
  • 前馈电容技术解析!
  • 7/29
  • js高级第一天
  • Git 小白极速入门笔记
  • Git课程讲义
  • sakuraFrp页面503
  • 企业级AI Agent(智能体)报告
  • 2025倒闭半导体公司大盘点