【PHP】PHP面试存在环的单链表寻找环的入口点 && php判断单链表是否有环和相交

php判断单链表是否有环和相交

超级好的讲解php链表结构的教程:https://blog.csdn.net/hjh15827475896/article/details/109314432

 

超级好的讲解php环形链表面试题解析:https://blog.csdn.net/fynjy/article/details/47440049

看了这么多文章,觉得这个作者写的寻找环入口是最好理解的,对不起作者,忘记出处的网址了,当时粘到WORD文档里的,如果再次看到了,一定标明出处!!

 问题2:若存在环,如何找到环的入口点(即上图中的结点E)?
      解答:(将快指针步数从2调整回1,且归零到原点)如图中所示,设链起点到环入口点间的距离为x,环入口点到问题1中fast与low重合点的距离为y,又设在fast与low重合时fast已绕环n周(n>0),且此时low移动总长度为s,则fast移动总长度为2s,环的长度为n。则
       s + kn = 2s,n>0      ①
       s = x + y               ②

为什么会有② s = x+y,我解释一下:

因为快指针速度是慢指针2倍,所以在慢指针进入环的那刻起,无论快指针在哪,慢指针在一圈之内必与快指针相遇。
      由①式得  s = kn                
      代入②式得
      kn = x + y
      x = kn - y                ③

得出:

从开始0到环形入口距离为x即kn-y;

快指针再次回到0,走到入口处花了x距离,那么相应的慢指针也必须走x距离即kn-y,而我们知道【快慢指针第一次相遇】距离0为x+y,那么慢指针再次走x距离后当前位置为:(x+y) + (kn-y) = kn + x;

没错,就是kn+x,kn就是k圈可以省略约去,那么慢指针此处也走到了x,是不是和快指针再次相遇了,并且快指针此时位置在入口处

 

posted @ 2021-03-09 17:50  PHP急先锋  阅读(99)  评论(0编辑  收藏  举报