所以我正在处理面试问题,我给出了以下内容:
/** Give a circularly linked list, implement an algorithm which returns
* the node at the beginning of the loop. */
我见过那个杀手锏慢跑者/乌龟& hare方法有两个指针和一些聪明的数学来找到起始节点,但我想出了以下解决方案,我想知道是否有任何错误或任何批评你们可以看到与通常的解决方法相比。这对我来说似乎太容易了,但它有效是有意义的:只需浏览一下列表,如果你曾经遇到过你之前看过的节点,那就意味着你处于循环的开始阶段。
/** Give a circularly linked list, implement an algorithm which returns
* the node at the beginning of the loop. */
public static Node firstInLoop(Node n) {
HashSet<Node> visited = new HashSet<>();
while (n != null) {
if (visited.contains(n)) {
return n;
} else {
visited.add(n);
n = n.tail;
}
}
return null;
}
答案 0 :(得分:2)
乌龟和野兔方法使用O(1)内存和O(n)时间,而你的算法使用O(n)内存和O(n)时间,但可能在时间上使用较小的常数因子。