Given a linked list, return the ndoe where the cycle begins. If there is no cycle, return null.
To represetn a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then tehre is no cycle in the linked list.
Note: Do not modify the linked list.
Example 1:
Input: head = [3,2,0,-4], pos = 1
Output: tail connects to node index 1
Explanation: There is a cycle in the linked list, where tail connects to the second node.
Input: head = [1,2], pos = 0
Output: tail connects to node index 0
Explanation: There is a cycle in the linked list, where tail connects to the first node.
Input: head = [1], pos = -1
Output: no cycle
Explanation: There is no cycle in the linked list.
public class Solution {
public ListNode detectCycle(ListNode head) {
HashSet<ListNode> set = new HashSet<ListNode>();
while (head != null) {
if (set.contains(head)) return head;
set.add(head);
head = head.next;
}
return null;
}
}
2 * (a + b) = a + b + c + b
a = c
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode meetPoint = meetingPoint(head);
// acyclic
if (meetPoint == null)
return meetPoint;
// same speed, opposite direction -> same distance
ListNode front = head;
ListNode end = meetPoint;
while (front != end) {
front = front.next;
end = end.next;
}
return front;
}
/**
* This finds the meeting point Z
*/
private ListNode meetingPoint(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (slow == fast) {
return fast;
}
}
return null;
}
}