问题:对一个链表,判断是否有环。存在环时,求出环的起始位置及环长度
使用快慢指针
1、判断是否有环,快指针移动两步,慢指针每次移动一步,看快慢指针是否会相遇
2、环的起始位置
如上图所示,假设快慢指针相遇点为离环起始位置 b,快指针移动距离为a+(b+c)n+b,慢指针移动距离为a+b,则有a+(b+c)*n+b=2(a+b) => a = (n-1)(b+c) + c。为什么慢指针在第一圈时就相遇?因为假设在环起始位置时,环长度为L,快指针在环上位置为b',慢指针经过c'相遇,则有c' mod L= (b' + 2c') mod L => c' + nL = b' + 2c' =>c' = nL - b' 当n=1时,c' = L - b'
在求环的起始位置时,将慢指针重置为链表的首位置,快慢指针每次前进一步,直到慢快指针相遇,此时相遇位置即为环的起始位置。
3、环的长度。在求得环的起始位置后,计数重置为0,慢指针每次前进一步,计数加1,直到慢指针等于快指针。此时计数值就是环的长度