题目
leetcode-cn.com/problems/li… 给一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
思路
环形链表的题就是快慢指针,fast=fast.next.next,slow=slow.next,快慢指针同时指向头节点,然后快指针一次走两步,慢指针一次走一步,然后他们相遇之后让其中一个指针指向头节点,然后再一起一步步往前走,再次相遇的那个点就是环起点啦。
因为如果有环,一开始快指针就能“超圈”慢指针然后追上它。因为他俩一起开始跑的嘛,所以追上肯定是超圈,所以这时候他们的路程差(假设是k)肯定等于圈长,也就是环长度。假设这时候他俩位置离环起点长度是m,那这个环剩下的长度就是k-m,然后这时候起点也就是head离环起点的长度也是k-m(因为慢指针走了k),所以这时候让他俩一个回起点,然后再一起以一样速度往前跑,再次相遇就是环起点啦。
代码
public ListNode detectCycle(ListNode head) {
if ( head ==null){
return null;
}
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
slow =head;
while (slow != fast){
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
return null;
}
}