题目:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回null
分析过程:
- 设置一个slow指针和一个fast指针,开始时,slow和fast指向链表的头,然后slow每次跳一步,fast每次跳两步。
- 如果链表无环,那么fast一定先到终点,直接返回null。
- 如果有环,那么fast和slow一定会再次相遇,当fast和slow相遇的时候,让slow重新回到head的位置,fast不动。接下来,fast指针从每次移动两步改为移动一步,slow依然每次只移动一步。
- fast指针和slow一定会再次相遇,并且在第一个入环的节点处相遇。
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if(fast == slow) {
break;
}