前天阿里面试面试官问了我一个老题目,就是判断链表中是否有环。之前只是看了下解法,没有深入思考,所以说了快慢指针解法之后,面试官质疑可行性,可是现场没有进行深入的验证。昨天想起来验证了下可行性。
先来回忆一下解法:设置两个指针,一个慢指针pSlow和一个快指针pFast,pSlow每次走一步,pFast每次走两步,若快指针的下一节点或下下节点为空指针,则表示没有环,否则如果有环,一定会在某一个时刻相交。
下面来验证有环时一定会相交:
假设非环段有S个节点,环中有C个节点,环与非环的交点为p,快慢指针第一次相交的交点为x。

当pSlow走到节点p的时候(即走了S个节点),pFast走到节点q(即走了2S个节点),在这时间点之前(pSlow没在环中相当于慢指针逐渐落后快指针),两个指针间距是逐次加一的,在这之后(pSlow进入环中相当于快指针在追慢指针),两个指针的间距要逐次减一,所以一定有一个时刻两个节点相交。
现求环与非环的交点p,假设在x节点处第一次相交:慢节点在p节点的这个时刻,与q节点的逆向距离为L=(C-S%C),(q节点与p节点的顺向距离为S),所以当走了L次后,快慢指针同时指向节点x。要找到节点p,慢指针再走c-L步。
所以如果有环,找到第一个相交交点的复杂度是O(S+L)。
浙公网安备 33010602011771号