题目描述:
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解析:两个指针一快一慢,若链表没有环则快指针不可能与慢指针相遇,返回null。若有环则二者必然相遇:快指针与慢指针在环中第一次相遇即slow=fast时,将slow保持不变,而将fast=pHead,此时二者开始第二次往后走直到再次相遇即可得到环的入口节点。
Java代码实现:
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead == null || pHead.next == null){
return null;
}
ListNode fast = pHead;//定义两个指针同时指向头节点
ListNode slow = pHead;
while(fast != null && fast.next != null){//若存在环形链表
fast = fast.next.next;
slow = slow.next;
if(slow == fast){//当在环内找到相遇节点slow=fast,立即将fast指向pHead
fast = pHead;
while(fast != slow){//快慢指针每次走一步直到相等,此时慢指针指向入口节点
fast = fast.next;
slow = slow.next;
}
if(fast == slow){
return slow;
}
}
}
return null;
}
}