题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
定义两个指针,一个快一个慢,让快指针始终比慢指针多走一步
如果链表存在环,那么两个指针肯定会相遇在环中
找到环中的位置可以计算出环的长度
从首指针开始将环遍历一遍,如果与环中的一个节点相同
那么这个节点就是环的入口节点
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
ListNode meet = meetNode(pHead);
if(meet == null) return null;
int len = 1;
ListNode p1 = meet;
while(p1.next != meet){
p1 = p1.next;
len++;
}
p1 = pHead;
while(p1 != meet){
p1 = p1.next;
for(int i = 0; i < len;i++){
meet = meet.next;
if(p1 == meet) break;
}
}
return p1;
}
private ListNode meetNode(ListNode head) {
if(head == null) return null;
ListNode low = head.next;
if(low == null) return null;
ListNode fast = low.next;
while(fast != null && low != null){
if(fast == low) return fast;
fast = fast.next;
low = low.next;
if(fast != low) fast = fast.next;
}
return null;
}
}