在这里插入图片描述
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
//令快指针一次走两个,慢指针一次走一个,快慢相遇也说明有环。
//此时令慢的回到头,快的在原地。让快的和慢的同时走,快慢一次都走一个,相遇的地方即是入口。
//使用快慢指针,fast指针每次移动两个,slow指针每次移动一个,
//如果有环他们一定会在环内相遇
ListNode fast = head;
ListNode slow = head;
while(fast!=null && fast.next!=null){
fast = fast.next.next;
slow = slow.next;
// 快慢指针相遇,此时从head 和 相遇点,同时查找直至相遇
if(fast == slow){ //说明在环内相遇了,找起点,头节点到相遇点
//此时令index的回到头,快的在原地。让快的和慢的同时走,快慢一次都走一个,相遇的地方即是入口。
ListNode index1 = head;
ListNode index2 = fast;
while(index2 != index1){
index2 = index2.next;
index1 = index1.next;
}
return index1; // 返回环的入口
}
}
return null;
}
}