LeetCode刷题,环形链表二(142)

1,458 阅读1分钟

求环形链表的入环点

题目要求,是让我们返回一条环形链表的入环点,比如链表a = 1->3->4->5->6->7->8->5,返回值为5的那个节点。

思路一:快慢指针定位

  1. 假设链表头节点位置离链表入环点的距离为a。
  2. 此时慢指针走到入环点时,慢指针距离为a,快指针距离为2a.
  3. 假设环的长度为a + x,此时快指针想要追上慢指针就需要x步,也就是x轮,因为在一个圆圈里面,一个走两步一个走一步,每一轮就多追上一步,这样在x轮后快慢指针相遇,此时当前相遇点离入环点距离就等于 (a+x)- x = a;
  4. 由此推理可得头节点到入环点的距离,等于快慢指针相遇点到入环点的距离。那么我们将头结点和相遇点一起循环往下走,当它们再次相遇时就找到了入环点。

思路一:JS代码实现

var detectCycle = function(head) {
  if (!head) return null;
  let p = head; // 慢指针
  let q = head; // 快指针
  while (q && q.next) {
    p = p.next;
    q = q.next.next;
    if (q === p) { // 代表链表有环,且快慢指针相遇
      let temp = head; // 重新获取头结点
      while (q !== temp) { // 头结点和相遇点每次都走一步。
        q = q.next;
        temp = temp.next;
      }
      return q; // 当走到这行代码时,代表temp 和 q又相遇了,此时就是入环点。
    }
  }
  return null; // 如果走到这里,代表链表无环直接返回null
};