JavaScript 版解法

function EntryNodeOfLoop(pHead) {
    let fast = pHead, slow = pHead;
    while (fast != null && fast.next != null) {
        // 快、慢指针每次分别走两步、一步
        fast = fast.next.next;
        slow = slow.next;
        if (fast === slow) break;  // 如果二者相遇就退出循环
    }
    // 判断快指针是否已经到达链表尾部,如果是,那说明链表无环,返回 null
    if (fast == null || fast.next == null) return null;
    slow = pHead;  // 如果有环,令慢指针重新指向头节点,快指针仍指向相遇点
    // 这一次,快慢指针每次都走一步,二者相遇点即为链表环的入口节点
    while (fast != slow) {
        fast = fast.next;
        slow = slow.next;
    }
    return fast;
}

至于为什么“第二次,快慢指针每次都走一步,二者一定会相遇且首次相遇点即为链表环的入口节点”,读者可参考 详解为什么用一步两步快慢指针?三步四步可以吗