链表寻找环入口

链表寻找环入口

X
d1
d2
起点
入口
相遇

如图所示起点到入口距离为 x x x,入口到相遇点距离为 d 1 d1 d1,相遇点到入口距离为 d 2 d2 d2,环的周长为 C = d 1 + d 2 C = d1 + d2 C=d1+d2
快指针一次走两步,慢指针一次走一步。
相遇时:快指针一共走了 f a s t l = x + n ∗ C + d 1 fastl = x + n * C + d1 fastl=x+nC+d1 步,慢指针一共走了 s l o w l = x + m ∗ c + d 1 slowl = x + m*c + d1 slowl=x+mc+d1步。 f a s t 1 = 2 s l o w l fast1 = 2slowl fast1=2slowl
x + n ∗ C + d 1 = 2 x + 2 m ∗ C + 2 d 1 x + n * C + d1 = 2x + 2 m * C + 2 d1 x+nC+d1=2x+2mC+2d1
=>
( n − 2 m ) ∗ C = x + d 1 (1) (n-2m)*C=x+d1 \tag{1} (n2m)C=x+d1(1)
慢指针再从起点开始走,快指针也与慢指针一起走,每次走一步。
当慢指针走到入口时:
慢指针走了 x x x步,快指针走了 f a s t l + x = x + n ∗ C + d 1 + x fastl + x = x + n * C + d1 + x fastl+x=x+nC+d1+x步。
带入(1)
x + n ∗ C + d 1 + x = x + n ∗ C + ( n − 2 m ) ∗ C = x + ( 2 n − 2 m ) ∗ C x + n*C + d1 + x = x + n * C + (n-2m)*C= x + (2n-2m) * C x+nC+d1+x=x+nC+(n2m)C=x+(2n2m)C
也就是 x x x加上 ( 2 n − 2 m ) (2n-2m) 2n2m圈环,所以一定会相遇。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值