剑指offer_链表中环的入口结点

142 阅读1分钟

题目描述

给定一个链表,若其中包含环,则输出环的入口节点。

若其中不包含环,则输出null。

样例:

给定如上所示的链表:
[1, 2, 3, 4, 5, 6]
2
注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。

则输出环的入口节点3.

image.png

1 判断是否有环,快慢指针 2 获取环的长度,新开一个变量,在走一圈记录环的长度 3 找公共节点 双指针,一个指针从头开始先走 环的长度大小的步,最后等交点即可

Code

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

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var entryNodeOfLoop= function(head) {
    if(!head || !head.next) return null;
    let p1 = head.next;
    let p2 = head.next.next;
    //1. 判断是否有环
    while(p1 != p2){
        if(p2 === null || p2.next === null) return null;
        p1 = p1.next;
        p2 = p2.next.next;
    }
    
    //2.相遇 获取环的长度
    let length = 1;
    let tmp = p1;
    p1 = p1.next;
    while(tmp != p1){
        p1 = p1.next;
        length++;
    }
    
    //3.找到公共节点
    p1 = p2 = head;
    for(let i = 0; i < length ; i++){
        p1 = p1.next;
    }
    while(p1 != p2){
        p1 = p1.next;
        p2 = p2.next;
    }
    return p1.val;
    
};