从《Cracking the Coding Interview》一书中,有一个练习题如下:
给定一个循环链表,实现一个算法来返回循环开始的节点。
循环链表定义:一个(损坏的)链表,其中一个节点的下一个指针指向一个较早的节点,以便在链表中形成一个环。
算法的答案基本上是使用一个慢跑者和一个快跑者迭代遍历链表,以查看它是否循环。如果慢跑者和快跑者相遇,则表示它循环,然后您找到循环开始的节点。(如果它们不相撞,则快跑者最终将到达链表的末尾,这意味着没有循环。)
但是,书中关于找到循环开始节点的答案依赖于假设该链表具有大小为k的“非循环”部分。一旦慢跑者和快跑者相遇,您将把慢跑者移动到链表的头部。您以相同的速度迭代两个指针,直到它们相遇。它们相遇的位置就是循环开始的节点。
我的问题是,是否可能在不假设链表具有大小为k的“非循环”部分的情况下找到循环开始的节点?还是我必须假设有一个大小为k的“非循环”部分?
给定一个循环链表,实现一个算法来返回循环开始的节点。
循环链表定义:一个(损坏的)链表,其中一个节点的下一个指针指向一个较早的节点,以便在链表中形成一个环。
算法的答案基本上是使用一个慢跑者和一个快跑者迭代遍历链表,以查看它是否循环。如果慢跑者和快跑者相遇,则表示它循环,然后您找到循环开始的节点。(如果它们不相撞,则快跑者最终将到达链表的末尾,这意味着没有循环。)
但是,书中关于找到循环开始节点的答案依赖于假设该链表具有大小为k的“非循环”部分。一旦慢跑者和快跑者相遇,您将把慢跑者移动到链表的头部。您以相同的速度迭代两个指针,直到它们相遇。它们相遇的位置就是循环开始的节点。
我的问题是,是否可能在不假设链表具有大小为k的“非循环”部分的情况下找到循环开始的节点?还是我必须假设有一个大小为k的“非循环”部分?
n
的列表。循环的大小可以是k
,其中0 <= k <= n
,并从i
开始,其中0 <= i < n
。考虑k = 0
和k = n
的情况以及跑步者的结束位置。 - Ripi2