题目:给定一个链表的头节点head, 返回链表开始入环的第一个节点。如果链表无环,则返回null
思路:
- 先判断链表中是否有环 (leetcode141题 )
- 之后在判断环的入口第一个结点 (需要用到数学思想)
推导过程看以下链接
最后推导出 同时从头节点和相遇节点出发的两个指针,每次走一步 最终会在环的入口相遇
时间复杂度 O(n) 空间复杂度 O(1)
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode f = head; //快指针
ListNode s = head; //慢指针
if(head ==null){
return null;
}
while(f!=null&&f.next!=null){
f=f.next.next;
s=s.next;
if(f==s){
//说明有环 此时快慢指针都指在环入口位置
s=head; //将慢指针重新指回头节点
while(s!=f){
s=s.next;
f=f.next;
}
return s;
}
}
return null;
}
}