【leetcode】142.环形链表 II

50 阅读1分钟

leetcode-142.png

寻找环的起始点

图解.png

上图可以看到,如果相遇点是meet,那么fast肯定走了2n步,slow肯定走了n步 那么此时环的大小也就是n了,如果此时在相遇点meet还有起点head重新出发两个指针,步伐为1,那么他们相遇的点就是环的起始点了

var detectCycle = function (head) {
  let slow = head, fast = head
  while (fast && fast.next) {
    slow = slow.next
    fast = fast.next.next
    if (slow === fast) {
      // 找到了 meet
      break
    }
  }
  // 如果不存在环,那么 fast 或者 fast.next 就是 null 了
  if (fast === null || fast.next === null) return null
  let start = head, reStart = fast
  while (start !== reStart) {
    start = start.next
    reStart = reStart.next
  }
  return start
};