这是关于“破解编码面试”一书中的练习2.8。在那里,他们要求在链表中找到一个循环。他们提出了一个快速跑步者/慢跑者的方法,但我找到了一个小得多的解决方案,并想确认我的解决方案是否存在任何类型的问题。
我决定最初创建一个哈希表“all False”,跟踪一个节点是否已被访问过。然后我执行一个循环,直到“当前节点”已经被访问,结束循环:
class Node():
def __init__(self,data=None,next=None):
if data!=None:
self.data=data
self.next=next
def find_loop(head,hash_table):
node=head
while hash_table[node]==False:
print(node.next.data)
hash_table[node]=True
node=node.next
node_at_beginning_of_loop=node
return node.data
if __name__ == "__main__":
import sys
node3=Node()
node5=Node(11,node3)
node4=Node(5,node5)
node3.data=6
node3.next=node4
node2=Node(2,node3)
node1=Node(9,node2)
hash_table={}
for i in range(1,6):
hash_table[globals()['node%s' % i]]=False
print(find_loop(node1,hash_table))
答案 0 :(得分:0)
您的解决方案可行,但这不是一个有效的解决方案。空间方面的解决方案。快/慢跑步者是O(n)时间和O(1)空间。您的解决方案是O(n)时间和O(n)空间。此外,您应该在python中使用HashSet / set而不是HashMap / dictionary。