时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
热度指数:355664
本题知识点: 链表
题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
代码
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function EntryNodeOfLoop(pHead)
{
if(!pHead || !pHead.next || !pHead.next.next) {return null;}
let slow = pHead.next;
let fast = pHead.next.next;
while(slow != fast){
slow = slow.next;
fast = fast.next.next;
}
let head = pHead;
while(head != fast){
head = head.next;
fast = fast.next;
}
return head;
}
分析:
使用快慢指针,如果链表中有环,则快慢指针终会相遇,如果没有相遇则返回null。当快慢指针相遇时,链表的起点head至入口结点的距离和入口结点至相遇点的距离一样,让起点head的指针与相遇点的指针一步一步往后走,二者会在入口结点相遇。