题解 | #链表中环的入口结点#
链表中环的入口结点
http://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
快慢指针解法,快指针走两步慢指针走一步
当两针相遇时,快指针移动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; }