```/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function EntryNodeOfLoop(pHead)
{
// write code here
//参考剑指,让p1指针先走环中节点数目n步(这里最重要,建议画图自己模拟),然后p1、p2同时出发,相遇则为环的入口
//环中节点数目可以通过快慢指针判断是否有环,在指针相遇的节点开始计数来得出
if(pHead === null || pHead.next === null){return null}
let p1 = pHead
let p2 = pHead
//当p2和p2.next都存在时,快慢指针步进直到相遇,如果没有环那么指针不会相遇也不会返回值
while(p2 && p2.next){
p1 = p1.next
p2 = p2.next.next
//相遇时存在环,记录节点,并将慢指针p2重置回pHead
if(p1===p2){
p2 = pHead
let temp = p1
let n = 1
while(p1.next!==temp){
n++
p1=p1.next
}
//让快指针先走n步
p1=pHead
for(let m=0;m<n;m++){p1=p1.next}
//p1、p2开始同时向前步进,相遇即是入口节点
while(p1!==p2){
p1 = p1.next
p2 = p2.next
}
if(p1===p2){return p1}
}
}
}
module.exports = {
EntryNodeOfLoop : EntryNodeOfLoop
};