题目概述:
给定一个链表,返回链表开始入环的第一个节点。
如果链表无环,则返回 null。
解题思路:(快慢指针)
f为快指针所走的步数
s为慢指针所走的步数
a为入环前所有的结点数
b为环里面所有的结点数
n为所走的圈数
第一次相遇
(1)f=2s
(2)f=s+nb
由(1)(2)得
f=2nb
s=nb
假设我们从开始统计步数k
则k=a+nb时走到入环的第一个结点
看上面 s=nb 在这个时间点如果s再走a步刚好到入环的第一个结点
问题转变为求a
把f指针指向头结点 然后让f和s一起走 直到两者相撞则返回slow值就可
此时
f=a
s=a+nb
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(true)
{
if(fast == null || fast.next == null)
return null;
slow=slow.next;
fast=fast.next.next;
if(slow == fast) break;
}
fast = head;
while(fast != slow)
{
slow=slow.next;
fast=fast.next;
if(slow == fast)
break;
}
return slow;
}
}