题目描述
给定一个链表,若其中包含环,则输出环的入口节点。
若其中不包含环,则输出null。
样例:
给定如上所示的链表:
[1, 2, 3, 4, 5, 6]
2
注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。
则输出环的入口节点3.
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;
};