数据结构与算法每日一题——链表(142. 环形链表 II)

70 阅读1分钟

142. 环形链表 II

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var detectCycle = function (head) {
    if (!head || !head.next) { return null }
    //   设置快慢指针,都从链表头出发,快指针每次走两步,慢指针一次走一步
    //   假如有环,一定相遇于环中某点
    //   接着让两个指针分别从相遇点和链表头出发,两者都改为每次走一步,最终相遇于环入口
    let fast = head
    let slow = head
    while (slow && fast && fast.next) {
        slow = slow.next
        fast = fast.next.next
        // 先找相遇点
        if (fast === slow) {
            let p = head
            while (fast != p) {
                fast = fast.next
                p = p.next
            }
            return p
        }
    }
    return null
};