50 lines
974 B
Java
50 lines
974 B
Java
/*
|
|
* @lc app=leetcode id=142 lang=java
|
|
*
|
|
* [142] Linked List Cycle II
|
|
*/
|
|
|
|
// @lc code=start
|
|
/**
|
|
* Definition for singly-linked list.
|
|
* class ListNode {
|
|
* int val;
|
|
* ListNode next;
|
|
* ListNode(int x) {
|
|
* val = x;
|
|
* next = null;
|
|
* }
|
|
* }
|
|
*/
|
|
public class Solution {
|
|
/**
|
|
* 2 * k - s - (k - s) = p * r
|
|
* 2 * k - s - k + s = p * r
|
|
* k = p * r, 且 k > s
|
|
*
|
|
* s + p * r + m - 2m = q * r
|
|
* s = q * r - p * r + m
|
|
*
|
|
* @param head
|
|
* @return
|
|
*/
|
|
public ListNode detectCycle(ListNode head) {
|
|
if(head == null) {
|
|
return null;
|
|
}
|
|
Set<ListNode> tracked = new HashSet<>();
|
|
ListNode cur = head, r = null;
|
|
while(cur != null) {
|
|
if(tracked.contains(cur)) {
|
|
r = cur;
|
|
break;
|
|
}
|
|
tracked.add(cur);
|
|
cur = cur.next;
|
|
}
|
|
return r;
|
|
}
|
|
}
|
|
// @lc code=end
|
|
|