判断两个单链表是否相交

判断两个单链表是否相交,如果相交,给出相交的第一个点(两个链表都不存在环)。

比较好的方法有两个:

一、将其中一个链表首尾相连,检测另外一个链表是否存在环,如果存在,则两个链表相交,而检测出来的依赖环入口即为相交的第一个点。

二、如果两个链表相交,那个两个链表从相交点到链表结束都是相同的节点,我们可以先遍历一个链表,直到尾部,再遍历另外一个链表,如果也可以走到同样的结尾点,则两个链表相交。

这时我们记下两个链表length,再遍历一次,长链表节点先出发前进(lengthMax-lengthMin)步,之后两个链表同时前进,每次一步,相遇的第一点即为两个链表相交的第一个点。

注释1

设r为环长,则fast指针r/2内可以跑完一圈,若r为奇数,刚r步内fast会遍历循环内所有点.刚r内一定会跟slow相遇.若r为偶数,r/2步内可令fast跟slow的最近距离为2或1(f追赶s).若为2,则

fast+2=slow

所以下一步时slow的位置是slow+1;而fast则为fast+2;

再下步slow+2,fast+4;

因为之前fast+2=slow,所以

slow-2+4=slow+2

又因为最近距离为1时,只要两指针各走一步便相遇.

所以两指针相遇.最大步数为s<=r/2+2(r>=4)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值