题目描述

一个链表中包含环,请找出该链表的环的入口结点。要求不能使用额外的空间。

解析:快慢指针。快慢指针相遇时,快指针走了2k长度,慢指针走了k长度。多的k长度就是环的长度。假设相遇点距离环入口为m,则环入口距离起始点为k-m,恰巧相遇点的指针再走k-m节点就为环入口。所以同时继续出发,再次相遇点就是环的入口。

public ListNode EntryNodeOfLoop(ListNode pHead) {
 	if (pHead == null || pHead.next == null)
  		return null;
   	ListNode slow = pHead, fast = pHead;
    do {
   		 fast = fast.next.next;
         slow = slow.next;
      } while (slow != fast);
     fast = pHead; 
     while (slow != fast) {
       	 slow = slow.next; 
         fast = fast.next;
      }
         return slow;
   }