//思路:1.判断链表中有环 -> 2.得到环中节点的数目 -> 3.找到环中的入口节点 public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { if(pHead == null){ return null; } // 1.判断链表中有环 ListNode l=pHead,r=pHead; boolean flag = false; while(r != null && r.next!=null){ l=l.next; r=r.next.next; if(l==r){ flag=true; break; } } if(!flag){ return null; }else{ // 2.得到环中节点的数目 int n=1; r=r.next; while(l!=r){ r=r.next; n++; } // 3.找到环中的入口节点 l=r=pHead; for(int i=0;i<n;i++){ r=r.next; } while(l!=r){ l=l.next; r=r.next; } return l; } } }
/*fast一次走2步,slow一次走一步,如果该链表有环,两个指针必然在环内相遇 此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内的相遇点), 这次两个指针继续走,一次走一步,相遇的地方就是入口节点*/ /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } */ public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { ListNode fast=pHead,slow=pHead; while(fast!=null&&fast.next!=null){ fast=fast.next.next; slow=slow.next; if(slow==fast){ break; } } if(fast==null||fast.next==null) return null; fast=pHead; while(fast!=slow){ slow=slow.next; fast=fast.next; } return fast; } }