环形链表的快慢指针相遇问题证明
证明1:慢指针一定在环形链表一圈内遇上
首先假设慢指针的每次只走1步,快指针每次走2步,当慢指针走了k次后,慢指针共走了k步,而快指针走了2k步。
假如说,快指针和慢指针一定会相遇,那么一定是在环内,同时快指针已经走了n圈环。此时该问题也就可以转变为一下问题何时有解
2 k − k = n B → k = n B ( n = 1 , 2 , . . . , N ) 2k - k = nB \rightarrow k = nB (n = 1,2,...,N) 2k−k=nB→k=nB(n=1,2,...,N)
当n=1时,此时有k=B,也就是慢指针走的k步等于环的长度。此时是否有解呢?显然是有的,因为 k ∈ [ 0 , A + B ] k \in [0, A+B] k∈[0,A+B]。所以肯定有一个值等于B。
而当 n ≥ 1 n≥1 n≥1 时,k = nB,则需要考虑A+B是否大于nB,此时不一定有解
因此慢指针一定在环形链表一圈内遇上得证。
证明2: 当两指针相遇后,a = c
假设慢指针slow 走了 l s l o w = a + b l_{slow} = a + b lslow=a+b
快指针走了 l f a s t = a + n ( b + c ) + b l_{fast} = a + n(b+c) + b lfast=a+n(b+c)+b
而有 2 l s l o w = l f a s t 2l_{slow} = l_{fast} 2lslow=lfast ,因此求得 2 ( a + b ) = a + n ( b + c ) + b → a = c + ( n − 1 ) ( b + c ) 2(a+b) = a + n(b+c) + b \rightarrow a = c + (n-1)(b+c) 2(a+b)=a+n(b+c)+b→a=c+(n−1)(b+c)
而我们在证明1中证明了当且仅当n=1时,必有解,因此上式可以化为 a = c a=c a=c
即快慢指针相遇时,另一指针从初始点出发,会与慢指针相遇在环的入口
如有错误,欢迎指正,大家一起进步!