头节点Head,快指针fast,慢指针slow。
初始快慢指针都等于Head,slow一次走一格,fast一次走两格。
另外我们现在要达成共识,first_meet节点一定在环内部,即相遇的地方一定是在环里面的某处。能理解再往下看。
快慢指针第一次相遇时,假设都等于first_meet,即二者在first_meet节点相遇。那么二者第一次相遇一定是因为快指针把慢指针套圈了,即fast比slow多走了一个环的周长。我们假设这个周长为circle(比如节点3->节点4->节点5->节点3,这个环的周长是3),则slow指针共走了circle长度,fast共走了两个circle长度,一减等于circle,正好,没毛病。
我们想求的是环的入口位置,即环的入口离Head头节点的距离。那么设这个未知量为x,我们现在要求解x的值。
头节点到入口距离为x,头节点到相遇位置距离为circle(忘了怎么来的回去看第三段),则入口离相遇位置距离为circle-x。从相遇处往后走到环的入口处,走的距离也是circle-x。原因:入口到相遇处距离为circle-x,那么环的长度减这一段,就等于环上剩下的长度。到这里我们得到了从头节点走到环入口的距离等于从相遇处走到环入口的距离的结论,那么显然我们就分别从head和first_meet分别往后移动,第二次相遇时的位置就一定是环的入口。