剑指offer-36、两个链表的第⼀个公共节点

news/2025/11/11 9:04:00/文章来源:https://www.cnblogs.com/sevencoding/p/19203921

题⽬描述

输⼊两个链表,找出它们的第⼀个公共结点。(注意因为传⼊数据是链表,所以错误测试数据的提示是⽤其他⽅式显示的,保证传⼊数据是正确的)

思路及解答

HashSet包含法

第⼀种做法,直接依赖于 HashSet ,遍历第⼀个链表的时候,将所有的节点,添加到 hashset 中,

遍历第⼆个链表的时候直接判断是否包含即可,属于空间换时间的做法。

public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {if (pHead1 == null || pHead2 == null) return null;// 使用HashSet存储第一个链表的所有节点HashSet<ListNode> visited = new HashSet<>();// 遍历第一个链表,将所有节点加入集合ListNode current = pHead1;while (current != null) {visited.add(current);current = current.next;}// 遍历第二个链表,检查节点是否在集合中current = pHead2;while (current != null) {if (visited.contains(current)) {return current; // 找到第一个公共节点}current = current.next;}return null; // 没有公共节点}
  • 时间复杂度​:O(m+n),需要遍历两个链表各一次
  • 空间复杂度​:O(min(m,n)),存储较短链表的节点

双栈法

利用栈的后进先出特性,从链表尾部开始比较,找到最后一个相同的节点。公共节点之后的节点都是相同的,所以从后往前比较,最后一个相同的节点就是第一个公共节点

import java.util.Stack;public class Solution {/*** 使用双栈查找两个链表的第一个公共节点* 思路:将两个链表分别压入栈中,然后同时出栈比较* 时间复杂度:O(m+n),空间复杂度:O(m+n)*/public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {if (pHead1 == null || pHead2 == null) return null;Stack<ListNode> stack1 = new Stack<>();Stack<ListNode> stack2 = new Stack<>();// 将两个链表的所有节点分别压入栈中ListNode current = pHead1;while (current != null) {stack1.push(current);current = current.next;}current = pHead2;while (current != null) {stack2.push(current);current = current.next;}ListNode commonNode = null;// 同时从两个栈弹出节点进行比较while (!stack1.isEmpty() && !stack2.isEmpty()) {ListNode node1 = stack1.pop();ListNode node2 = stack2.pop();if (node1 == node2) {commonNode = node1; // 记录公共节点} else {break; // 遇到不同节点,停止比较}}return commonNode;}
}
  • 时间复杂度​:O(m+n),需要遍历两个链表各两次(压栈和出栈)
  • 空间复杂度​:O(m+n),需要两个栈存储所有节点

长度差法(推荐)

可以将两个链表想象为两段路程,公共节点是终点。让长的链表先走多出的距离,然后同时前进,就能同时到达公共节点

譬如现在有⼀个链表 1->2->3->6->7 ,另外⼀个链表 4->5->6->7 ,明显可以看出第⼀个公共节点是6 。

最直接的⽅法,每⼀个链表都遍历⼀次,计算链表中的个数,⽐如 1->2->3->6->7 个数为5, 4->5->6->7 个数为4,两者相差1(设为k)个。

我们可以使⽤两个指针,分别指向链表的头部。然后让第⼀个链表的指针先⾛ k=1 步。

这样就相当于指针后⾯的两个链表等⻓了。

就可以开始⽐较,如果不相等,则两个指针都往后移动即可,知道节点为null。

/*
public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}*/
public class Solution {public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {// 只要有⼀个为空,就不存在共同节点if (pHead1 == null || pHead2 == null) {return null;}// 计算链表1中的节点个数int numOfListNode1 = 0;ListNode head1 = pHead1;while (head1 != null) {numOfListNode1++;head1 = head1.next;}// 计算链表2中节点个数int numOfListNode2 = 0;ListNode head2 = pHead2;while (head2 != null) {numOfListNode2++;head2 = head2.next;}// ⽐较两个链表的⻓度int step = numOfListNode1 - numOfListNode2;if (step > 0) {// 链表1更⻓,链表1移动while (step != 0) {pHead1 = pHead1.next;step--;}} else {// 链表2更⻓,链表2移动while (step != 0) {pHead2 = pHead2.next;step++;}}// 循环遍历后⾯的节点,相等则返回while (pHead1 != null && pHead2 != null) {if (pHead1 == pHead2) {return pHead1;} else {pHead1 = pHead1.next;pHead2 = pHead2.next;}}return null;}
}
  • 时间复杂度​:O(m+n),需要遍历链表三次(两次计算长度,一次查找)
  • 空间复杂度​:O(1),只使用常数级别额外空间

但是上⾯的做法,如果公共节点在最后⼀个,假设⼀个链表⻓度为 n ,⼀个为 m ,那么计算个数就要全部遍历,需要 n+m 。两个链表都移动,到最后⼀个节点的时候才相等,也是 n+m ,也就是 O(2*(n+m)) 。

双指针遍历法(最优)

有没有更加好⽤的做法呢?肯定有,我们来看:

两个链表分别是:

如果我在第⼀个链表后⾯拼接上第⼆个链表,第⼆个链表后⾯拼接上第⼀个链表,就会变成下⾯的样⼦:

发现了⼀个规律,也就是拼接之后的链表,是等⻓度的,第⼀个和第⼆个链表都从第⼀个开始⽐较,只要相等,就说明是第⼀个公共节点。也就是上⾯被圈起来的 6 节点。

原理如下:

  • 设链表1独有部分长度为a,链表2独有部分长度为b,公共部分长度为c
  • 指针p1路径:a + c + b
  • 指针p2路径:b + c + a
  • 两个指针路径长度相同,会在公共节点相遇

特殊情况处理:​​当两个链表没有公共节点时,两个指针会同时变为null,退出循环

public class Solution {public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {// 只要有⼀个为空,就不存在共同节点if (pHead1 == null || pHead2 == null) {return null;}ListNode head1 = pHead1;ListNode head2 = pHead2;while (head1 !=head2) {// 如果下⼀个节点为空,则切换到另⼀个链表的头节点,否则下⼀个节点head1 = (head1 == null) ? pHead2 : head1.next;head2 = (head2 == null) ? pHead1 : head2.next;}return head1;}
}
  • 时间复杂度​:O(m+n),每个指针遍历两个链表各一次
  • 空间复杂度​:O(1),只使用两个指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/962026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回归与分类算法全解析:从理论到实践 - 实践

回归与分类算法全解析:从理论到实践 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

2025年知名的VR工厂远程云参观用户满意度榜单

2025年知名的VR工厂远程云参观用户满意度榜单行业背景与市场趋势随着全球数字化转型浪潮的推进,虚拟现实(VR)技术在工业领域的应用正迎来爆发式增长。根据IDC最新发布的《全球增强与虚拟现实支出指南》显示,2025年全…

2025年靠谱的日本公共交通票价查询方式通票购买指南榜

2025年靠谱的日本公共交通票价查询方式与通票购买指南榜日本公共交通市场现状与发展趋势日本作为全球公共交通系统最发达的国家之一,其轨道交通网络覆盖率达98.3%,每日运送旅客超过4000万人次(日本国土交通省2024年…

2025年评价高的打浆机折叠款行业内口碑厂家排行榜

2025年评价高的打浆机折叠款行业内口碑厂家排行榜行业背景与市场趋势随着农业机械化水平的不断提升,打浆机作为水田耕作的重要设备,市场需求持续增长。据中国农业机械工业协会最新数据显示,2024年我国打浆机市场规模…

2025年靠谱的视频号短视频推广热门推荐榜单

2025年靠谱的视频号短视频推广热门推荐榜单行业背景与市场趋势随着移动互联网的深度发展和5G技术的全面普及,短视频行业在2025年迎来了新一轮的增长高峰。根据最新发布的《2025中国短视频行业发展白皮书》显示,中国短…

2025年稳压器厂家权威推荐榜单:家用稳压器/电梯稳压器/机床稳压器源头厂家精选

在电力设备领域,稳压器作为保障电压稳定、确保设备安全运行的关键设备,其性能质量直接关系到工业生产系统的稳定性。本文将根据技术实力、产品性能和市场反馈,为您推荐三家在稳压器领域表现卓越的源头厂家。 随着工…

2025年知名的大阪机场接送舒适便捷权威榜

2025年知名的大阪机场接送舒适便捷权威榜行业背景与市场趋势随着全球旅游业的持续复苏,日本作为亚洲热门旅游目的地,2024年接待国际游客数量已突破4000万人次,其中大阪关西国际机场作为西日本重要枢纽,年旅客吞吐量…

文件上传大小限制

select * From posts where content like %ccaa.51cema% update posts set content=REPLACE(content,ccaa,xue) where content like %ccaa.51cema% select * from posts where content like %http://127.0.0.1:9998/st…

2025年热门的不锈钢线条TOP品牌厂家排行榜

2025年热门的不锈钢线条TOP品牌厂家排行榜行业背景与市场趋势不锈钢线条作为现代建筑装饰和家居设计的重要元素,近年来市场需求持续增长。根据中国金属材料流通协会最新数据显示,2024年中国不锈钢线条市场规模已达87…

详细介绍:机器人 / 仿生 / 机械人身化 AI(Embodied AI) ——制造业智能化转型的关键引擎

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年口碑好的不锈钢压花最新TOP厂家排名

2025年口碑好的不锈钢压花最新TOP厂家排名行业背景与市场趋势不锈钢压花制品作为现代家居和工业应用中的重要材料,近年来市场需求持续增长。根据中国金属制品行业协会2024年发布的报告显示,全球不锈钢压花市场规模已…

Python3 sys模块和os模块的区别是什么?

Python3 sys模块和os模块的区别是什么?在 Python 中,sys模块和os模块都是与系统交互的核心工具,但它们的定位和功能边界有显著区别:sys模块聚焦于 Python 解释器本身的交互,而os模块专注于操作系统层面的操作。以…

2025年11月数控加工中心推荐:知名厂家排行榜与口碑评价对比指南

一、引言 2025年四季度,国内高端装备采购进入年度冲刺阶段,数控加工中心作为汽车、航空航天、模具等精密制造环节的核心设备,其选型决策直接决定产线良率与资金效率。面对“交期紧、精度高、售后响应快”的三重需求…

Redis终极面试题:从基础到原理,从概念到实战的10道“必杀题”

面试题切记贪多,十道必会Redis面试题,都搞懂就够了~ Redis作为内存数据库的标杆,是后端工程师面试的“必考题”。本文从基础概念→数据结构→持久化→分布式→高级特性→生产实践,整理了10道最具代表性的Redis终极…

2025年11月数控加工中心推荐:知名厂家榜与口碑评价对比指南

一、引言 数控加工中心作为现代金属切削的“工作母机”,直接决定零件精度、换线速度与批量稳定性,是汽车、航空航天、模具、医疗等用户降本增效的核心装备。2025年四季度,下游订单向“多品种、小批量、短交期”倾斜…

2025年口碑好的海绵吸盘热门厂家推荐榜单

2025年口碑好的海绵吸盘热门厂家推荐榜单行业背景与市场趋势随着工业自动化水平的不断提升,真空吸盘作为自动化生产线上的关键零部件,市场需求持续增长。根据《2024-2029年中国真空吸盘行业市场调研与投资前景预测报…

快递查询

1.新建线程组 http请求 以及查看结果树 2.打开万维易源,打开快递查询,复制网址route.showapi.com,选择get,路径2650-3 勾选对post使用.... 3.添加参数appKey 复制万维易源网站密钥,添加参数com 填写所要查询的快递…

Python3 sys 模块

Python3 sys 模块在 Python 中,sys模块是与解释器交互的桥梁,提供了一系列用于访问 Python 解释器本身和操作系统相关信息的函数与变量。无论是获取命令行参数、控制程序退出、还是查看系统环境,sys模块都扮演着不可…

2025年质量好的马车不锈钢螺栓最新TOP厂家排名

2025年质量好的马车不锈钢螺栓最新TOP厂家排名行业背景与市场趋势随着全球制造业的持续复苏和基础设施建设的加速推进,紧固件行业迎来了新一轮增长机遇。根据中国机械通用零部件工业协会最新数据,2024年中国紧固件市…

2025年11月摩擦焊机销售厂家推荐:靠谱排行前五生产厂家对比与市场报告

一、引言 摩擦焊机作为固态焊接技术的代表设备,已在汽车、航空航天、轨道交通、能源装备等对连接质量要求极高的领域扮演关键角色。对于计划新增或升级产线的企业采购者而言,设备能否在“高节拍、低能耗、零缺陷”三…