给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL,最后有力扣题的链接
根据上面的动图我们可以推出下列结论:
前提:fast和slow相遇了
1.fast走的路程是多少:
答:X+C+(C-Y)
2.slow走的路程是多少:
答:X+C-Y
3.fast走的路程是slow的两倍:
因为fast一次走两步,slow一次走一步,下面是一个数学问题,把分别对应的路程带入然后化简即可
2*(X+C-Y) = X + C + C -Y
X + X + C + C - Y - Y = X + C + C - Y
X - Y = 0
X = Y
通过这个结论我们可以得出,起始点的距离到入口点的距离 和 相遇点的距离到入口点的距离是相等的,所以我们以相同的速度,一个从起始点出发一个从相遇点出发,再次相遇,就是入口点!!
但是这里又出现了新的问题,如果环很小我们应该怎么办呢?
这种情况下,slow已经走完很多圈了,但是fast还没有走到入口点的位置,我们又该如何应对,请看下面的解释
1.fast走的路程是多少:
答:X+NC+(C-Y) //N代表的是圈数
2.slow走的路程是多少:
答:X+C-Y
3.fast走的路程是slow的两倍:
2*(X + C - Y) = X + NC + C - Y
X + X + C + C - Y - Y = X + NC + C - Y
X + C - Y = NC
X = NC - C + Y
X = (N-1)C + Y
如果N为1,那么X = Y
最后我们附上力扣的题的链接:. - 力扣(LeetCode)
public class Solution {
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){
fast = head;
while(fast != slow){
fast = fast.next;
slow = slow.next;
}
return slow;
}
}
return null;
}
}
首先得判断是否成环,如果是环那么在找入口点,如果不是环,那么返回null