用快慢指针的方法
根据推出的表达式:slow和fast相遇的时候,让slow和位于头节点的p同时
向前走,刚好在入环的节点处相遇!注意:b和c交界的点不一定是从例如-4这个节点处,
可能是0节点处。因为相遇的点只能是在2、0、-4这几个点,c的长度并不一定是一个next就可以
到达入环口的长度!
重点是理解a b c的关系!
public ListNode detectCycle1(ListNode head) {Set<ListNode> visited = new HashSet<>();while (head != null) {if (visited.contains(head)) return head;visited.add(head);head = head.next;}return null;}public ListNode detectCycle(ListNode head) {ListNode slow = head;ListNode fast = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;if (slow == fast) {ListNode p = head;while (p != slow) {p = p.next;slow = slow.next;}return p;}}return null;}