找带环链表的入口点
- 首先起初要判断链表是否带环
引出:如何判断是否带环
快慢引用
1. 一个走一步,一个走两步;如果相遇,表示带环;如果快的遇到 null ,说明不带环。最终返回 null 。
2. 额外考虑:快的依次走3步及以上
可能会错过:两个结点的环,永远遇不到
3.如何找环入口点
结论:两个引用(同样速度),一个从起点出发,一个从相遇点出发,直到遇到,那个结点就是入口点。
主要代码
public ListNode detectCycle(ListNode head) {
if (head == null) {
return null;
}
ListNode fast = head;
ListNode slow = head;
do {
fast = fast.next;
if (fast != null) {
fast = fast.next;
slow = slow.next;
}
} while (fast != null && fast != slow);
if (fast == null) {
return null;
}
ListNode p1 = head; // p1 从起点出发
ListNode p2 = slow; // p2 从相遇点出发
while (p1 != p2) { // 只要 p1 == p2 ,一定是入口点
p1 = p1.next;
p2 = p2.next;
}
return p1;
}
}