| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 | 'use strict'/** * Definition for singly-linked list. * function ListNode(val) { *     this.val = val; *     this.next = null; * } */function ListNode(val) {    this.val = val    this.next = null}/** * @param {ListNode} head * @return {ListNode} */var detectCycle = function (head) {    // Assume l1 = dis(head, entry), and l2 = dis(entry, meeting),    // c = len(cycle), n = count of loop (fast pointer), then    // dis(head, fast) = l1+l2+n*c = 2*dis(head, slow) = 2*(l1+l2).    // So l1 = c-l2+(n-1)*c, for a pointer in cycle, it means    // l1 = c - l2, ie. dis(head, entry) = dis(meeting, entry).    if (!head) return null    let slow = head    let fast = head    let entry = head    while (fast.next && fast.next.next) {        slow = slow.next        fast = fast.next.next        if (fast === slow) {            while (entry !== slow) {                entry = entry.next                slow = slow.next            }            return entry        }    }    return null}function __main__() {    /* eslint no-console: ["error", {"allow": ["log"]}] */    const logger = console.log.bind(console)    const n5 = new ListNode(5)    const n4 = new ListNode(4)    n4.next = n5    const n3 = new ListNode(3)    n3.next = n4    const n2 = new ListNode(2)    n2.next = n3     const n1 = new ListNode(1)    n1.next = n2    n5.next = n3    logger(n3)    logger(detectCycle(n1))}__main__()
 |