Detect Cycle
https://leetcode.com/problems/linked-list-cycle/
https://www.geeksforgeeks.org/detect-loop-in-a-linked-list/
class Solution:
def hasCycle(self, head: ListNode) -> bool:
return self.hasCycleEditingNodes(head)
def hasCycleWithSet(self, head: ListNode) -> bool:
"""
Time: O(N) -> iterates all the list
Space: O(N) -> needs to store all the list in the set
"""
nodes = set()
while head is not None:
if head in nodes:
return True
nodes.add(head)
head = head.next
return False
def hasCycleEditingNodes(self, head: ListNode) -> bool:
"""
Time: O(N) -> iterates all the list
Space: O(1) -> flags are added inplace
"""
while head is not None:
if hasattr(head, 'visited') and head.visited:
return True
head.visited = True
head = head.next
return False
def hasCycleFloyd(self, head: ListNode) -> bool:
"""
Time: O(N) -> iterates all the list
Space: O(1) -> no extra space required (just two pointers)
"""
slow = fast = head
while slow and fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
Last updated