解题思路:
第一步 先判断是否有环 快慢指针
第二步 如果有环的话 把环的长度计算出来
第三步 最为重要的一步,既然我们知道了环的长度 那么我们就假设把环从节点处展开 变成一条没有环的直线链表,这种情况下 两个慢指针 一次都走一步,如果把其中一个指针A从头开始先走一个环的长度 另一个指针B还是从头走,大家好好想想 当A走到尾巴的时候 是不是B刚好走到之前环的入口处! 这里可以画图理解
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
import java.util.ArrayList;
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) {
//第一步 先判断是否有环 快慢指针
if(pHead == null || pHead.next == null){
return null;
}
ListNode fast = pHead;
ListNode slow = pHead;
boolean hasLoop = false;
while(fast.next != null){
fast = fast.next.next;
if(fast == null){
break;
}
slow = slow.next;
if(fast == slow){
hasLoop = true;
break;
}
}
if(hasLoop){
//第二步 如果有环的话 把环的长度计算出来
int n = 1;
fast = fast.next;
while(fast != slow){
n ++;
fast = fast.next;
}
//第三步 最为重要的一步
//既然我们知道了环的长度 那么我们就假设把环从节点处展开 变成一条没有环的直线链表
//这种情况下 两个慢指针 一次都走一步,如果把其中一个指针A从头开始先走一个环的长度 另一个指针B还是从头走
//大家好好想想 当A走到尾巴的时候 是不是B刚好走到之前环的入口处! 这里可以画图理解
fast = pHead;
slow = pHead;
for(int i = 0 ;i< n;i++){
fast = fast.next;
}
while(fast != slow){
fast = fast.next;
slow = slow.next;
}
return fast;
} else {
return null;
}
}
}


京公网安备 11010502036488号