使用辅组数组
import java.util.*; public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { Set<ListNode> vector = new HashSet<>(); ListNode p = pHead; while(true){ if(p == null) return null; if(vector.isEmpty() || !vector.contains(p)){ vector.add(p); p = p.next; }else{ return p; } } } }
使用快慢指针
因为当两个指针相遇的时候,表示快指针跑过的距离为2倍慢指针距离,那么如题解中设x和y分别为慢指针走过的距离,那么快指针走过2x+2y,由于重复了一段距离y,且快指针也走过了x+y,那么未知距离为x,也就是等于入口的AB距离,故而重新设置快指针到初始位置,挨个遍历,到相遇即可。public ListNode EntryNodeOfLoop(ListNode pHead) { ListNode fast = pHead, slow = pHead; while(fast.next != null && slow.next != null){ fast = fast.next.next; slow = slow.next; if(fast == slow) break; } if(fast == null || fast.next == null) return null; fast = pHead; while(fast != slow){ fast = fast.next; slow = slow.next; } return fast; }