JAVA
① 放在集合中遍历
public class Solution {
public ListNode detectCycle(ListNode head) {
Set<ListNode> ans = new HashSet<ListNode>();
while (head != null) {
if (ans.contains(head))
return head;
ans.add(head);
head = head.next;
}
return null;
}
}
② 数学推导
public class Solution {
public ListNode detectCycle(ListNode head) {
if (head == null) {
return null;
}
ListNode slow = head, fast = head;
while (fast != null) {
slow = slow.next;
if (fast.next != null) {
fast = fast.next.next;
} else {
return null;
}
if (fast == slow) {
ListNode ptr = head;
while (ptr != slow) {
ptr = ptr.next;
slow = slow.next;
}
return ptr;
}
}
return null;
}
}
对于快指针 fast:
a
=
n
(
b
+
c
)
+
b
a=n(b+c)+b
a=n(b+c)+b
对于慢指针 slow:
2
(
a
+
b
)
2(a+b)
2(a+b) 【快指针的路程是慢指针的两倍】
二者相减:
a
+
b
=
n
(
b
+
c
)
a+b=n(b+c)
a+b=n(b+c)
化简得:
a
=
(
n
−
1
)
(
b
−
c
)
+
c
a=(n-1)(b-c)+c
a=(n−1)(b−c)+c
含义:从相遇点到入环点的距离加上 n − 1 n-1 n−1 圈的环长,恰好等于从链表头部到入环点的距离
Python
① 放在集合中遍历
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
ans = []
while (head):
if head in ans:
return head
else:
ans.append(head)
head = head.next
return None
② 数学推导
class Solution(object):
def detectCycle(self, head):
fast, slow = head, head
while True:
if not (fast and fast.next): return
fast, slow = fast.next.next, slow.next
if fast == slow: break
fast = head
while fast != slow:
fast, slow = fast.next, slow.next
return fast