我们在解决环形链表问题时,可以设置快慢二指针,慢指针每次向后移动一位,快指针向后移动多位。通过判断慢指针能否追上快指针(即快指针指向的地址是否等于慢指针指向的地址)来判断该链表是否为环形链表。
假设慢指针入环,此时快慢指针距离为N,则快指针开始追击慢指针,假设快指针每次移动3位,慢指针移动1位,每次追击距离缩小2,此时快慢指针的位置关系为。
如此看来,若N为偶数时,第一次循环就找到了,而若N为奇数,距离变为C-1。
1.C-1为偶数,第二次循环找到。
2.C-1为奇数,则永远追不上。(N为奇数,C为偶数)
我们对永远追不上的情况进行判断。当slow进环时,已经走过了链表除环外的距离L。
且fast的速度是slow的3倍,则fast走了3*L的距离。
3*L=L+x*C+C-N
2*L=(x+1)*C-N
所以不存在C是偶数且N是奇数的情况,快慢指针必将相遇。