Linked List Cycle
링크드 리스트의 헤드 노드가 주어졌을 때, 해당 리스트에 싸이클이 있는지를 확인하자.
노드 개수는 최대 10000개 이다.
접근 1 - DFS
- DFS 하다가 이전에 방문한 적 있는 노드를 또 방문한 경우 싸이클이다.
- 공간, 시간 복잡도 모두 O(N)
"""
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
"""
def hasCycle(head):
if not head:
return False
stack = []
visited = set()
stack.append(head)
while stack:
node = stack.pop()
if node in visited:
return True
visited.add(node)
if node.next:
stack.append(node.next)
return False
접근 2 - 거북이와 토끼 포인터
- 거북이 포인터와 토끼 포인터를 동시에 리스트를 여행할 때, 만약 싸이클이 있으면 둘은 항상 만나게 된다.
- 공간 복잡도가 O(1)
def hasCycle(head):
if not head:
return False
fast, slow = head, head
while fast.next and fast.next.next:
fast = fast.next.next
slow = slow.next
if slow == fast:
return True
return False