我的思路是创建一个set
public class Solution {
public ListNode detectCycle(ListNode head) {
HashSet<ListNode> set = new HashSet<>();
set.add(head);
while (head != null) {
if (set.contains(head.next)) return head.next;
set.add(head.next);
head = head.next;
}
return null;
}
}
最好的方法,快慢指针来解决。非环为x,环为y,相遇时快慢指针分别走了2y,y。然后头指针放个慢指针,和之前慢指针相遇点为环的入口。
public class Solution {
public ListNode detectCycle(ListNode head) {
if (head == null || head.next == null) return null;
ListNode quick = head.next.next;
ListNode slow = head.next;
while (quick != slow) {
if (quick == null || quick.next == null) return null;
quick = quick.next.next;
slow = slow.next;
}
while (head != slow) {
head = head.next;
slow = slow.next;
}
return slow;
}
}