算法 - 检测是否链表存在环

来源:互联网 发布:硕士论文数据造假 编辑:程序博客网 时间:2024/05/14 15:21

 

 

这儿例子使用快慢指针的办法实现。

 

(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

原创粉丝点击