求单链表交点

本文探讨如何高效地找到两个相交的单链表的交点。介绍了简单解法,如同步逆序遍历,以及优雅解法,通过计算长度差同步移动指针。还讨论了相关扩展问题,包括判断链表是否相交、查找环的存在及长度,以及确定链表中第一个在环内的节点。最后提出一种特殊解法,将问题转换为求单链表环的节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文首发在我的个人博客:https://jlice.top/p/7qhfm/。欢迎大家前去参观,么么哒~

题目

今天面试时,面试官问了这样一个问题:两个单链表相交,怎么求交点。所谓相交,就是两个节点的next指针相同。

https://jlice-top.oss-cn-beijing.aliyuncs.com/f51d0ee6039211e98b95509a4c21c90b.png

简单解法

一个简单的思路是:分别遍历这两个链表,并将这两个链表的节点分别保存到两个列表里,然后同步逆序遍历这两个列表,当出现不相同的元素时,则下一个元素就是这两个链表的交点。

例如,对于上图的两个单链表,遍历上面的单链表得到列表:A, B, C, D, E, F, G;遍历下面的单链表得到列表:H, I, E, F, G。因为单链表相交之后就汇合了,汇合之后的节点就是一样的,而汇合之前的节点不一样,所以同步逆序遍历这两个列表:G-G, F-F, E-E, D-I……于是,E节点就是交点。

这种做法时间复杂度为\(O(n)\),但空间复杂度为\(O(n)\),有没有空间复杂度更低的解法呢?

如果使用HashMap存储,先遍历上面的单链表,并把节点存储到HashMap里,然后遍历下面的单链表,每次都看当前节点是否已经存在于HashMap中,如果存在,则该节点就是交点。采用这种做法,不必把两个单链表都遍历完,不过依然没有降低空间复杂度。

另一种思路是暴力法,也就是遍历这两个链表,判断第一个链表的每个节点是否在第二个链表中,这种做法的时间复杂度为\(O(n^2)\)。

优雅解法

这个问题比较麻烦的地方在于,这两个单链表相交之前的部分的长度可能不一致。假

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值