【忍者算法】从十字路口相遇到链表交点:探索相交链表问题|LeetCode第160题 相交链表

news/2025/2/13 1:34:22/文章来源:https://www.cnblogs.com/renzhesuanfa/p/18712368

从十字路口相遇到链表交点:探索相交链表问题

生活中的相遇问题

想象两个人从不同的地方出发,最后在一个十字路口相遇。他们可能走过不同长度的路程,但最终会在同一个点汇合。这就很像我们今天要讨论的相交链表问题:两个链表从不同的起点出发,在某个节点相交,然后共享后续的路径。

问题描述

LeetCode第160题"相交链表"是这样描述的:给你两个单链表的头节点 headA 和 headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null。

例如:

A链表:      a1 → a2↘c1 → c2 → c3↗            
B链表: b1 → b2 → b3输出:返回节点c1

最直观的解法:哈希表记录

就像在一个城市里标记每个人走过的地方,最简单的方法是用一个哈希表记录第一个人走过的所有位置,然后看第二个人的路径中是否有重复的地方。

哈希表方法的实现

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {// 使用HashSet记录链表A中的所有节点Set<ListNode> visited = new HashSet<>();// 遍历链表A,将节点加入集合ListNode current = headA;while (current != null) {visited.add(current);current = current.next;}// 遍历链表B,查找第一个在集合中出现的节点current = headB;while (current != null) {if (visited.contains(current)) {return current;}current = current.next;}return null;}
}

优化解法:双指针技巧

仔细思考,我们发现一个有趣的现象:如果两个人分别走对方的路,他们最终一定会相遇!这就是双指针解法的灵感来源。

双指针方法的原理

想象两个人在散步:

  1. A从链表A出发,走完后转到链表B继续走
  2. B从链表B出发,走完后转到链表A继续走
  3. 如果链表相交,他们一定会在相交点相遇
    • 因为他们走过的总路程是相同的:链表A长度 + 链表B长度

示例运行

假设链表A:1→2→3→4,链表B:5→6→3→4(3是相交点)

指针A:1 → 2 → 3 → 4 → 5 → 6 → [3] ← 相遇!
指针B:5 → 6 → 3 → 4 → 1 → 2 → [3] ← 相遇!

Java代码实现

public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA == null || headB == null) {return null;}// 初始化两个指针ListNode pointerA = headA;ListNode pointerB = headB;// 当两个指针不相等时继续移动while (pointerA != pointerB) {// 移动指针A,如果到达末尾则转到链表BpointerA = (pointerA == null) ? headB : pointerA.next;// 移动指针B,如果到达末尾则转到链表ApointerB = (pointerB == null) ? headA : pointerB.next;}// 返回相交点(如果不存在相交点,两个指针都会是null)return pointerA;}
}

解法比较

让我们比较这两种方法:

哈希表法:

  • 时间复杂度:O(m+n)
  • 空间复杂度:O(m),m为链表A的长度
  • 优点:思路直观,容易理解
  • 缺点:需要额外的空间存储节点

双指针法:

  • 时间复杂度:O(m+n)
  • 空间复杂度:O(1)
  • 优点:不需要额外空间,优雅简洁
  • 缺点:理解起来稍微有点难度

实用技巧总结

解决链表相交问题的关键点:

  1. 理解相交后的节点都是共享的
  2. 考虑特殊情况(如空链表、不相交的情况)
  3. 善用双指针技巧
  4. 利用数学特性(路程相等原理)

相关的链表问题:

  • 判断链表是否有环
  • 找到链表环的入口
  • 链表的中间节点

小结

通过相交链表这道题,我们学会了如何巧妙地使用双指针技巧来解决看似复杂的问题。这种思维方式不仅能解决算法题,在处理数据流、文件比较等实际问题时也很有用。记住,当遇到需要找到两个序列共同元素的问题时,双指针技巧往往能提供一个优雅的解决方案!

延伸思考:

  1. 如果链表可能有环,这个算法还有效吗?
  2. 如果要找到所有的相交节点,应该如何修改算法?
  3. 在分布式系统中,如何处理类似的"路径相交"问题?

作者:忍者算法
公众号:忍者算法

🎯 回复【刷题清单】获取更多经典题目解析
👥 回复【加群】加入算法/面试交流群,一起学习进步
🧑‍💻 回复【代码】获取GitHub完整题解项目,包含Java/Python/JavaScript/Go/C++多语言实现

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

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

相关文章

DeepSeekSelfTool :流量分析、JS代码审计、进程分析

# DeepSeek;# AI ;# 代码审计;# 0day;# 渗透测试;# 通用 免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,文章作者和本公众号不承担任何法律及连带责任,望周知!!! 前言 首个由DeepSe…

【安全运营】告警如何区分自己人

前言 安全运营小伙伴可能都遇到过这样的情况,安全系统突然出现大量告警,看告警详情信息真真切切,凭感觉就是有攻击者在搞事情,于是立马启动应急响应,进入紧急状态,查询源目IP信息,电话联系相关人员开启三连问:这是什么系统,目前有做什么操作,能不能临时停用。最后一顿…

panellook筛选所有18寸面板

筛选后方便查看当前有哪些型号 https://www.panelook.com/sizmodlist.php?sizes[]=1800

大米CMS靶场支付漏洞

在大米CMS上购买一个商品,选择站内扣款并提交订单,BP抓包2. 根据抓包内容找到带有敏感信息的数据包(URL 带有dobuy),分析敏感信息 根据数据包中的信息我们可以获取下面可能有用的敏感信息 商品id,数量qty,价格price, 其他信息:是否购物车结算iscart,付款方式trade_type…

Spacedesk: 轻松实现手机控制电脑

这款强大的软件可以将您手头的手机或平板变身为电脑的第二块显示屏,轻松实现屏幕面积的扩展。告别昂贵的外接显示器,Spacedesk 为您打造无限可能的工作空间。最大的亮点在于,Spacedesk 不仅能扩展屏幕,还支持触控操作。您可以在手机或平板上直接进行各种操作,体验全新的交互方式…

DeepSeek开启AI办公新模式,WPS/Office集成DeepSeek-R1本地大模型!

从央视到地方媒体,已有多家媒体机构推出AI主播,最近杭州文化广播电视集团的《杭州新闻联播》节目,使用AI主持人进行新闻播报,且做到了0失误率,可见AI正在逐渐取代部分行业和一些重复性的工作,这一现象引发很多人的关注;前两天分享了一篇关于如何在Office和WPS中使用Deep…

vue+.net 利用signalR实现实时推送和显示通知消息

后端(.net) 创建SignalR Hub 创建类SysNoticeHub.cspublic class SysNoticeHub : Hub{}模拟接口发送在线通知 [Route("api/sysnotice")] [ApiController] public class SysNoticeController : BaseController {private readonly IHubContext<SysNoticeHub> _…

【SpringBoot代码审计】拿到了 SpringBoot 开发的系统,该如何代码审计分析漏洞?

众所周知,Java 语言生态在中大型企业中的使用率居高不下,可谓是如日中天,经久不衰。 使用 SpringBoot 架构来开发的 JavaWeb 系统,更是数不胜数,也因此我们渗透测试中一部分的挑战,可以说是来对抗 Java 代码。 如果我们拿到了基于 SpringBoot 开发的系统,想要进行代码审…

分组密码工作模式-ECB

一般分组密码加密分组大小为一固定长度,如128比特。如果消息长度超过固定分组长度时,在进行加密前,消息将被按照分组长度进行分块;如果消息长度不是分组长度的整数倍,则在分块后必须将其填充为分组长度的整数倍。 ECB模式是一种最直接的消息加密方法 ECB模式的加密和解密流…

BIT rating round #1 summary

历程和部分题解BIT 校赛定段赛第一场总结solved 9/12,rk3 , 罚时15发(乐历程 先拿掉 4 道签到,其中 J 题还被重边自环卡了 2 发,原本以为直接 BFS 可以忽略的。 快速扫题时,发现 G 题是做过的题,大概思路还记得,于是快快的写完首杀了(但也用了 30min)。 过完 5 题开始…

【Gitlab】企业级Gitlab监控面板:代码仓库的守护者

随着DevOps文化的普及,持续集成和持续部署(CI/CD)成为软件开发不可或缺的一部分。GitLab作为支持完整DevOps生命周期管理的平台,其企业级监控面板为企业提供了一种强大的工具来监督和优化这些过程。通过实时的数据可视化、性能分析和自动化告警功能,GitLab帮助企业更高效地…

【tomcat】IDEA 在远程 Tomcat 上调试项目简单吗?坑超多!

场景 本地通过IDEA调试云服务器上的项目,这个项目部署在云服务器的tomcat容器内(如下图),看着很简单,但是折磨了好久~一、Tomcat 开启远程调试端口 访问云服务器并通过docker exec -it <container_name> bash进入tomcat容器,修改bin目录下的calatina.sh文件,增加:…