题目要我们寻找一个链表中的是否有环,有环的话找出入环的第一个节点。
比较快的方式便是通过快慢指针来判别,快的指针从头开始每次走两步,慢的指针从开始每次走一步,若有环,他们必将在某一点处相遇。
就好像在操场上跑步,有跑的慢的,也有跑的快的,跑得快的会多与慢的相遇。
假设1是起点,2是入环点,3是相遇点,其中分别经过A、B、C三段路。
神奇的是,从他们从相遇点3开始,只要走与A等长的路,便能到达入环点2,下面给出证明:
在相遇的时候,慢指针一共走了A+B的路程,快指针一共走了A+N*(B+C)+B的路程,其中的N是指快指针在相遇前,绕环走了几圈。可以想象如果A特别长,而环回路特别短的话,快指针因为提前进入环而在里面转了很多圈。
快指针走的路程是慢指针的两倍=》2*(A+B)=A+N*(B+C)+B
可以解出 A=N*(B+C)-B=(N-1)*(B+C)+C
也就是说,当快指针和慢指针在3除相遇时,再走等同于A长度的路程,即(N-1)*(B+C)+C,在环中转了 N-1一圈后,再走C的长度的距离,便一定会到达A点。