解题思路:
第一步 先判断是否有环 快慢指针
第二步 如果有环的话 把环的长度计算出来
第三步 最为重要的一步,既然我们知道了环的长度 那么我们就假设把环从节点处展开 变成一条没有环的直线链表,这种情况下 两个慢指针 一次都走一步,如果把其中一个指针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; } } }