Solution (Set)
# Definition for singly-linked list.
from typing import Optional
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
# LinkedList์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ฉด True ๋ฆฌํดํ๋ ๋ฌธ์
class Solution:
# Set ๋ฐฉ์
# time: O(N)
# Runtime: 55ms
# Beats: 74.8%
def hasCycle(self, head: Optional[ListNode]) -> bool:
# ๋ฌดํ ๋ฃจํ์ ๊ฑธ๋ฆฌ์ง ์๋๋ก ์ฃผ์ํด์
# ์ฌ์ดํด ๋ถ๋ถ ํ๋จ ํ ๋ฐ๋ณต๋ฌธ ๋น ์ ธ๋์ค๊ฒ ํ์
visit_set = set()
# head๊ฐ null์ด ์๋๋ฉด ๊ณ์ ๋ฐ๋ณต๋ฌธ ๋์์ฃผ๊ธฐ
while head is not None:
# head๊ฐ visit_set์ ์ด๋ฏธ ์กด์ฌํ๋ฉด True ๋ฆฌํด
# ์๋๋ฉด ์ด๋ฏธ ์๋ค๋ ๊ฒ์ ๊ทธ ๋
ธ๋๊ฐ ์ด๋ฏธ ๋ฐฉ๋ฌธ๋์๋ค๋ ๊ฑฐ๋๊น
if head in visit_set:
return True
# set์ ๊ณ์ ๋ฃ์ด์ค์ผ์ง ํ๋จ์ ํ์ง
# head๊ฐ ์ด๋(.next)ํ๋ฉด์ ๊ณ์ set์ ๊ธฐ๋ณธ๊ฐ์ ๋ฃ์ด์ฃผ๋(add) ๊ฑฐ์ผ
visit_set.add(head)
head = head.next
# ๋ฐ๋ณต๋ฌธ์ ๋น ์ ธ๋์๋ค๋ ๊ฒ์ ์ด๋ฏธ null์ด๋ผ๋ ๊ฒ์ด๊ณ
# True๊ฐ ์ ๋์์ผ๋ ๋ฐฉ๋ฌธํ ์ ๋ ์์๋ค๋ ๊ฒ์ด๋
# False ๋ฆฌํด
return False
Solution (Floydโs tortoise and hare)
# Definition for singly-linked list.
from typing import Optional
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
# LinkedList์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ฉด True ๋ฆฌํดํ๋ ๋ฌธ์
class Solution:
# ์ํ ํ์ง ์๊ณ ๋ฆฌ์ฆ์ธ
# Floyd's tortoise and hare ์๊ณ ๋ฆฌ์ฆ ๋ฐฉ์
# ์ฒซ๋ฒ์งธ ํฌ์ธํฐ๋ ๊ฑฐ๋ถ์ด์ฒ๋ผ ๋๋ฆฌ๊ฒ ํฌ์ธํฐ๋ฅผ ์ด๋ํ๊ณ
# ๋๋ฒ์จฐ ํฌ์ธํฐ๋ ํ ๋ผ์ฒ๋ผ ๋น ๋ฅด๊ฒ ํฌ์ธํฐ๋ฅผ ์ด๋
# ๊ทธ๋ผ ์ธ์ ๊ฐ๋ ๋์ด ๋ง๋๊ฒ ๋จ
# time: O(N)
# Runtime: 59ms
# Beats: 51.97%
def hasCycle(self, head: Optional[ListNode]) -> bool:
# ๊ฑฐ๋ถ์ด ํฌ์ธํฐ, ํ ๋ผ ํฌ์ธํฐ ๊ฐ๊ฐ LinkedList์ head๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ์
turtle_pointer, rabbit_pointer = head, head
# ํ ๋ผ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ์ด์ ๋ ํ ๋ผ๋ฅผ ์ค์ ์ผ๋ก ์๊ฐํ๋ ์๊ณ ๋ฆฌ์ฆ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ (ํ ๋ผ ๋จผ์ ์งํ)
# next๋ฅผ ์ฒดํฌํ๋ ์ด์ ๋ ํ ๋ผ๊ฐ 2์นธ์ ํ๊บผ๋ฒ์ ์ด๋ํ๊ธฐ ๋๋ฌธ
while rabbit_pointer is not None and rabbit_pointer.next is not None:
# ๊ฑฐ๋ถ์ด๋ 1์นธ
turtle_pointer = turtle_pointer.next
# ํ ๋ผ๋ 2์นธ
rabbit_pointer = rabbit_pointer.next.next
# ๋ง ๋ฌ๋ฆฌ๋ค๊ฐ ๋์ด ๋ง๋๋ฉด True ๋ฆฌํด
if turtle_pointer == rabbit_pointer:
return True
# ๋ฐ๋ณต๋ฌธ ๋น ์ ธ๋์ค๋ฉด ๋์ด ๋ชป ๋ง๋๊ณ null์ด ๋ ๊ฑฐ๋๊น False ๋ฆฌํด
return False
Leave a comment