记面试遇到的一个智力题:追击问题

一个带环的单链表,一个快指针(每次走三步),一个慢指针(每次走一步),请问这两个指针可能无法相遇吗?

 

解:

 

假设慢指针入环时,快指针与慢指针的距离为L,环中共有n个节点,之后慢指针走了m步

 

解1:

那么两个指针重合的条件是: (线性同余方程) 

m % n = (3m+L) % n

 

也就是  m = 3m +L(mod n)

 

2m=n-L(mod n)

所以有解的条件是gcd(2,n)能被n-L整除,

所以为了无解,只能是n为偶数,n-l为奇数

也就是 环的长度为偶数,慢指针入环时与快指针相距距离为奇数

解2 

上面是大佬给的解答,我不太会线性同余方程,所以我另做了个解答

 

还是一样的假设

m % n = (3m+L) % n

这一次我们设置

m=a*n+c    (1)  走了a圈多c步

3m+L=b*n+c   (2)走了b圈多c步

那么将1带入2

3a*n+3c+L=b*n+c

那么

L=(b-3a)*n-2c

此时如果L为奇数,n为偶数,则无解

所以这样的条件无法相遇

 

 

 

你可能感兴趣的:(算法)