问题:给出一个链表环(像棒棒糖那样的,一个直线链一个环),问如何确定直线链和环的交点?直线链长多少?环长多少?
乍一看没大有头绪。感觉一般带链表环的总会用到追击法(一快一慢移动两个指针)来求,试一下吧。
假设快的指针为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回复二倍速,二者再次相遇,也可求环长)