这儿例子使用快慢指针的办法实现。
(H) LengthX (E)
------------------------+------------+
| |
| |
| | (M) (E->M: LengthY)
+-----------+
(M->E: LengthZ)
Length of circle = LengthY + LengthZ
假定
1. 开始点是H, 环的进入点是E, 快指针和慢指针首次相遇的点是M.
2. 慢指针和快指针首次相遇在M点的时候, 是慢指针首次到达M点, 而此时快指针是第N(N>=2)次到达M点。
3. 此后如何快指针慢指针还是按照原来的逻辑走, 那么当下一次慢指针到达M点的时候, 快指针和慢指针又相遇与M点, 也就是说以后每次他们俩都相遇与M点, 而此时慢指针正好又走了一圈, 而快指针正好又走了两圈。
-- 计算入口点E和环长度--
当慢指针首次到达M点的时候, 慢指针走过的路程是(H->E) 和(E->M)其长度为LengthX+LengthY
而此时快指针走过的长度为2(LengthX+LengthY), 因为慢指针都一步, 快指针走两步.
快指针走过的长度 = LengthX + LengthY + (LengthY + LengthZ) * N = 2 * (LengthX+LengthY) // N >= 1
=> (LengthY + LengthZ) * N = (LengthX+LengthY)
当把快慢指针分别从M点按照步进1的速度往回退的时候, 当慢指针回退到H点时, 快指针正好回退到M点, 此时把快慢指针分别按照步进1的速度前进, 当他们相遇的时候就是环的第一个入口点E。
Code start
Code end