本题依然是用快慢指针解决,思路如下:
快指针一次跑两步,慢指针一次跑一步,
如果不相遇,则没有环。
如果相遇,则必定在环中(环形链表只有入口,没有出口)。
相遇时:
慢指针在环外跑了a步,在环内跑了b步。
快指针在环外一共跑了2a+2b步,在环外跑了a步进入环,在环内跑了a+2b步。
快与慢指针移动距离相隔a+b步,环长即为a+b。
此时慢指针再跑a步则为入口节点,因为在环内已经跑了b步了。
这时让头节点和慢指针一起跑b步后,头节点所在位置则为入口节点。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
ListNode fast = pHead;
ListNode slow = pHead;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (slow == fast) {
while (pHead != slow) {
pHead = pHead.next;
slow = slow.next;
}
return pHead;
}
}
return null;
}
}