算法题006 判断两个链表是否相交
编程判断两个单向链表是否相交
题目来源
《编程之美》3.6节。
给出两个单向链表的头指针,判断这两个链表是否相交。假设两个链表都不带环。
分析
这个题目需要得出的结论是两个链表是否相交,即返回值应当是一个布尔值。
因为如果出现两个链表相交的情况,一旦程序释放了其中一个链表的所有节点,会造成信息丢失,另一个与之相交的节点也会受到影响。
解法一:直观的想法
可以判断第一个链表的每一个节点是否都在第二个链表中,这种方法的时间复杂度为O(Length(h1) * Length(h2)),这是一种很耗时间的解法。
解法二:利用hash表
两个链表相交,就会有共同的节点,而节点地址又是节点的唯一标识。
所以,如果我们能够判断两个链表中是否存在地址一致的节点,就可以知道这两个链表是否相交。
一个简单的做法是对第一个链表中的节点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址查询hash表,如果它在hash表中出现,那么说明第二个链表和第一个链表有共同的节点。
这个方法的时间复杂度为O(Length(h1) * Length(h2)),但是它同时要附加O(Length(h1))的存储空间。是以空间换时间的做法。
解法三:转化为链表有环问题
由于两个链表都没有环,我们可以把第二个链表接在第一个链表的尾部,如果得到的链表有环,则说明这两个链表相交。
这样,我们就把问题转化成了判断一个链表是否有环,这里需要注意的是,如果有环,那么第二个链表的表头一定在环上,我们只需要从第二个链表开始遍历,看是否会回到起始点就可以判断出来。
最后,别忘了恢复原来的状态,去掉从第一个链表到第二个链表表头的指向。
这个方法总的时间复杂度也是线性的,且只需要常数的空间。
解法四:抓住要点
如果两个没有环的链表相交于某一节点,那么在这个节点之后的所有节点都是两个链表所共有的。
根据这个特点,我们可以知道,如果两个链表相交,则最后一个节点一定是共有的。
所以可以先遍历第一个链表,记住最后一个节点。然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同则相交。
参考资料
《编程之美》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了