面试官(看似)的解释使问题变得困难,即以下形状也被认为是有效的:
A\ _____ A\ ___
\/ \ \ / \
\ / \ \ /
+---' +-------------'
/ P / P
/ /
B/ B/
即存在一个交汇点,但列表会循环回到交汇点之前或之后的位置。计算列表长度的过程并没有直接帮助,因为循环列表的长度没有定义。
首先请注意,循环列表末尾的循环长度可以通过以下 O(1) 内存 / O(n) 时间过程来计算:
int loop_length(List *n) {
Node *hare = n, *tortoise = n;
int phase = 0, cnt = 0;
while (true) {
hare=hare->next; hare=hare->next; tortoise=tortoise->next;
if (hare==tortoise) phase++;
if (phase==1) cnt++;
if (phase==2) return cnt;
}
}
例如,考虑循环列表
(1)-->(2)-->(3)-->(4)
| |
(6)<--(5)
该算法的工作原理如下(T=乌龟,H=野兔):
/--------\
1--2--3--4--5--6 phase cnt
HT 0 0
T H 0 0
T H 0 0
HT 1 1
T H 1 2
H T 1 3
T H 1 4
HT 2 4 : TERMINATED, cnt=4
现在,如果在构成循环交汇点的节点(在示例中节点(3)中)之前有 X 个节点,即 X=2,并且循环由 C 个节点组成(在示例中 C=4),则当乌龟在 X 步后第一次进入交汇点,兔子在位置 (2X - X) % C 处进入循环,即 (X % C)(在示例中,乌龟在 2 步后进入 (3),第 3 只兔子是然后在位置 L = (2 % 4 = 2),即在节点 (5) 中(索引从零开始)。现在兔子需要 (C-L-1) 步才能到达乌龟(在示例)因为野兔有 L 个步骤的“优势”;这意味着直到野兔第一次遇到乌龟之前算法的步骤数为
X + (C - X % C - 1) ; in the example 2 + (4 - 2 - 1) = 3
C已知(由算法计算),可以计算出总步数(用S表示),即我们有
S + 1 - C = X - X % C
现在假设野兔作为 Q 步的额外优势,即野兔在算法开始之前向前移动前 Q 个下一个指针;然后当乌龟进入交汇点时,兔子位于 ((X + Q) % C) 位置,我们得到
S + 1 - C = X - (X + Q) % C
现在给出了计算从“A”和“B”到公共交汇点 P 的路径长度差的过程(表示长度 a 和 b 以及它们的差 a-b)(假设 a > b 且不损失概论)。
首先从起点A运行算法,计算循环长度C并存储步数S_A。然后运行它,使乌龟从 A 开始,野兔在B并计算步数S_X。这意味着野兔现在具有 (a-b) 节点的优势,即
S_X + 1 - C = a - (a + (a - b)) % C = a - (2a - b) % C
Thus
S - S_X == (a - b) modulo C
IE。差值给出了模 C 的长度差;要计算 C 的长度差商,通常从起点 B 运行算法,得到步数 S_B,即全部在一起
S_A + 1 - C = a - a % C
S_B + 1 - C = b - b % C
S_X - S_A == (a - b) % C
减去前两个方程得到
S_A - S_B = (a - b) + [-1 * (a % C) + b % C]
方括号中的项位于 ]-C,+C[ 中,因此
(S_A - S_B) - C < (a - b) < (S_A - S_B) + C
在此区间内,至多有两个差值等于 (S - S_X) 模 C;用它们来尝试找出连接点——问题就解决了。
Example:
A(1)--(2)
|
B(3)--(4)--(5)--(6)
\_________/
在S_A的计算中,兔子和乌龟在(5)处经过3步后相遇,返回周期长度3。在S_B的计算中,兔子和乌龟在(6)处经过3步后相遇,返回周期长度3。对于S_X,兔子从B进入,乌龟从A进入;两步后他们在 (4) 处相遇。这给出了
0 - 3 < (a - b) < 0 + 3
(3 - 2) == (a - b) modulo 3
即(a - b)之间的长度差是1模3;这给出了可能的长度差异 { -2, +1 }; -2 被假设 a > b 忽略,所以我们得到 a = b + 1。 然后通过从 A 向前遍历第一个 +1 节点到 (2),然后从双臂以相同的速度前进,找到交汇点,直到找到了交汇点。
与存在非共享循环和/或没有循环的情况进行集成作为读者的练习。