如何在给定的链表中找到循环的起始节点?我们称之为“循环点”
目前,我已经了解以下内容(使用慢/快指针):
1.假设列表具有大小为k的非循环部分 2.慢移动k步 3.快速移动2k步 4.快速是(2k-k)= k步"超前"慢速的 5.慢指针位于循环的开头;也称为“循环点” 6.快速从“循环点”或此时的慢指针“后面”的(LOOP_LENGTH-k)步 7.对于每1步缓慢移动,快速移动2步并通过1步赢得慢速。 8.因此,快速需要(LOOP_LENGTH-k)步才能遇到慢速并相撞 9.这是我不理解的一步: “在这个碰撞点,两个节点将距离循环的前端 k 步。” 10.找到碰撞点后,将一个指针移动到列表的头部。 11.现在以1步/轮的速度移动两个指针,直到它们相撞。它们同时相遇的节点即为循环的开始,因此为“循环点”。
有人可以请解释第9步及其后续步骤吗?
谢谢
目前,我已经了解以下内容(使用慢/快指针):
1.假设列表具有大小为k的非循环部分 2.慢移动k步 3.快速移动2k步 4.快速是(2k-k)= k步"超前"慢速的 5.慢指针位于循环的开头;也称为“循环点” 6.快速从“循环点”或此时的慢指针“后面”的(LOOP_LENGTH-k)步 7.对于每1步缓慢移动,快速移动2步并通过1步赢得慢速。 8.因此,快速需要(LOOP_LENGTH-k)步才能遇到慢速并相撞 9.这是我不理解的一步: “在这个碰撞点,两个节点将距离循环的前端 k 步。” 10.找到碰撞点后,将一个指针移动到列表的头部。 11.现在以1步/轮的速度移动两个指针,直到它们相撞。它们同时相遇的节点即为循环的开始,因此为“循环点”。
有人可以请解释第9步及其后续步骤吗?
谢谢
m = k + loop_length - r = some_n * loop_length + r + loop_length - r = (some_n+1) * loop_length
? - brainydexterk
步;当慢指针在k
处时,快指针比慢指针超前r = k%loop_length
;也就是说,慢指针比快指针超前loop_length-r
- 因为慢指针位于循环点,如果我们将它到快指针的距离加起来,再从快指针向它的距离,我们得到loop_length
。这就是拥有循环的含义。而r = k%loop_length
意味着k = some_n * loop_length + r
,其中some_n
是某个值(包括可能为0)。因此,m = k + loop_length - r
。 - Will Nessloop_length - r
步,因此快指针需要loop_length - r
步才能追上慢指针,它们会在某个地方相遇。总步数将是m = k + loop_length - r
。 - Will Nessk
(非循环),然后进入循环的r
步。此时,慢指针在循环点处,并且比快指针超前了loop_length-r
步。快指针将在恰好loop_length-r
步中追上慢指针。因此,m = # of steps for pointers to meet; => m = k + (loop_length - r)
。这个代换也产生了loop_length
的some_n factor
。 - brainydexter