链表环

来源:互联网 发布:moto z force网络参数 编辑:程序博客网 时间:2024/06/06 02:23

问题:给出一个链表环(像棒棒糖那样的,一个直线链一个环),问如何确定直线链和环的交点?直线链长多少?环长多少?

乍一看没大有头绪。感觉一般带链表环的总会用到追击法(一快一慢移动两个指针)来求,试一下吧。

 假设快的指针为fast,慢的为slow

 fast步长是slow的两倍(几倍都行无所谓,两倍好计算)

 fast追到slow时,slow路程为s步

 直线长a,环长n

 相遇的点距离交点为r

 开始分析吧:fast追到slow时,slow一定不会走完一整圈的环(自己思考为什么,可以用极限的方式思考),那么fast比slow多跑整数倍的n(为什么是整数倍,我们可以想象一下假如fast已经走了超过一圈,就当4圈吧,现在在距离slow 987/1000*n的位置,那么fast要套slow一圈是不是又得多跑13/1000*n呢?是不是多跑5圈,整数圈?fast未超过一圈时,道理一样),设为yn吧。

2s=s+yn

s=a+r

由上二式得出

a+r=yn,推出

a=yn-r,推出

a=(y-1)n+(n-r)

那么n-r是什么呢?其实就是与r互补的那部分。

让slow回到最初的原点,fast与slow用相同的速度走,便可以找到交点。只不过fast又转了y-1圈而已。

有了总步数和直线长,环长计算出来分分钟的事情。(其实让fast回复二倍速,二者再次相遇,也可求环长)

原创粉丝点击