package 链表;
import java.util.HashSet;
import java.util.Set;
/**
* https://leetcode-cn.com/problems/linked-list-cycle-ii/
* @author Huangyujun
*
*/
public class _142_环形链表II {
//方法一:使用不重复的HashSet 集合
public ListNode detectCycle(ListNode head) {
ListNode pos = head;
Set<ListNode> visited = new HashSet<ListNode>();
while (pos != null) {
if (visited.contains(pos)) {
return pos;
} else {
visited.add(pos);
}
pos = pos.next;
}
return null;
}
//快慢指针法(只快一步噢)
public ListNode detectCycle2(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;
}
}