快慢指针解法,快指针走两步慢指针走一步
当两针相遇时,快指针移动2k步,慢指针移动k步
即指针走k步回移动到相遇点。
设相遇点到环头位置距离m
即第三个指针从头移动k-m次就会移动到环头
又应为现在相遇的指针相等于在环头多走了m步,
所以同时相同速度移动新旧指针,当移动k-m步相遇,这时的相遇点就是环头
public ListNode EntryNodeOfLoop(ListNode pHead) {
//解法2,快慢指针
ListNode fast = pHead;
ListNode slow = pHead;
int stepF = 0;
int stepS = 0;
while (fast!=null&&slow!=null){
if(stepF>stepS&&fast==slow){
break;
}
fast = fast.next;
if(fast!=null) {
fast=fast.next;
stepF+=2;
}else {
return null;
}
slow=slow.next;
stepS++;
}
if(fast==null||slow==null) return null;
//再走k-m步就会再次相遇
fast=pHead;
while (fast!=slow){
fast = fast.next;
slow = slow.next;
}
return slow;
}
京公网安备 11010502036488号