链表中环的入口结点

题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

分析:

  1. 这题我们可以采用双指针解法,一快一慢指针。快指针每次走两步,慢指针每次走一步。如果存在一个圈,总有一天,快指针是能追上慢指针的。
  2. 如下图所示,我们先找到快慢指针相遇的点 p,我们再假设,环的入口在点 q,从头节点到点 q 距离为 a,q 和 p 两点间距离为 b,p 和 q 两点间距离为 c。
  3. 因为快指针是慢指针的两倍速,且他们在 p 点相遇,如果环前面的链表很长,而环短,那么快指针进入环以后可能转了好几圈(假设为 n 圈)才和慢指针相遇。但无论如何,慢指针在进入环的第一圈的时候就会和快的相遇,那么就有 2(A+B)= A+ B + (n-1)(C+B)。
  4. 由 3 的等式,我们可得,C = A。
  5. 这时,因为我们的 slow 指针已经在 p,我们可以新建一个另外的指针 slow2,让他从头节点开始走,每次只走一步,原 slow 指针继续保持原来的走法,和 slow2 同样,每次只走一步。
  6. 我们期待着 slow2 和原 slow 指针的相遇,因为我们知道 A=C,所以当他们相遇的点,一定是 q 了。
  7. 我们返回 slow2 或者 slow 任意一个节点即可,因为此刻他们指向的是同一个节点,即环的起始点 q。

PS:与牛客相同!

代码:

posted on 2020-08-26 18:30  _那些你很冒险的梦  阅读(85)  评论(0)    收藏  举报

导航