快慢指针判断链表中是否存在环以及查找环的起始位置

  • Post author:
  • Post category:其他



判断链表中是否有环?


使用快慢指针, 慢指针一次走一步, 快指针一次走两步, 当快慢指针相遇时,说明链表存在环

为什么快指针每次走两步而慢指针每次走一步呢?

因为slow指针和fast指针都会进入环内, 就像在环形跑道内不同位置的两个人;slow指针在后面,

fast指针在前面, 但实际上fast指针也在追slow指针, 希望能在环内超slow指针一圈(当超过一圈时会

相遇)。那么fast指针总会追上slow指针的;


那么fast指针会不会跳过slow指针呢(为什么快慢指针的步骤差必须为1呢)?


不会的, 因为fast每次走2步,slow每次走1步,假设两者在环内的距离差为N, 那么每次走动, 距离差N都

会缩小一步, 因为fast与slow指针的步长差是1(1也是fast与slow指针之间距离的最小单位);最终,N会减少到0,

也就是两者会相遇。如果fast指针每次走两步,那么当fast与slow间只剩一步时, fast指针会错过slow指针;


如何查找链表环的起始位置?




假设slow指针和fast指针从A点出发, 最终在C点相遇, 那么可以判断链表中存在环; 此时slow指针移动距离为

L1+L2,

fast指针移动距离为

: L1+L2 + L3+L2;

由于fast指针速度是slow指针的2倍, 那么如果slow指针移动的距离为

S

, 那fast指针移动的记录就是

2S

, 所以

2 * (L1+L2) = L1+L2+L3+L2, 因此可以得出:



L1 == L3


那么如果将fast指针置于C点, slow指针置于A点, 这次以

相同的速度

移动, 当两个指针再次相遇时, 就是环的起始位置B点




版权声明:本文为qq_38975553原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。