|
| 1 | +''' |
| 2 | +*๋ฌธ์ ์ ์๋ : |
| 3 | +์ด ๋ฌธ์ ๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ฌ์ดํด์ด ์๋์ง ํ๋จํ๋ ๋ฌธ์ ์. |
| 4 | +์ฌ์ดํด์ด๋ ์ด๋ค ๋
ธ๋์์ ์์ํด์ next ํฌ์ธํฐ๋ฅผ ๊ณ์ ์ด๋์ํค๋ค ๋ค์ ์๋ ๋
ธ๋๋ก ๋์์ฌ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํจ |
| 5 | +
|
| 6 | +*ํด๊ฒฐ๋ฐฉ๋ฒ : ํ ๋ผ์ ๊ฑฐ๋ถ์ด ์๊ณ ๋ฆฌ๋ฌ์ ์ฌ์ฉํจ |
| 7 | +๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋๋ฐ, ๋๋ฆฐ ํฌ์ธํฐ(๊ฑฐ๋ถ์ด)๋ ํ ๋ฒ์ ํ์นธ์ฉ ์ด๋, |
| 8 | +๋น ๋ฅธ ํฌ์ธํฐ(ํ ๋ผ)๋ ํ ๋ฒ์ ๋ ์นธ์ฉ ์ด๋, ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ฉด ๋น ๋ฅธ ํฌ์ธํฐ๊ฐ ๋๋ฆฐ ํฌ์ธํฐ๋ฅผ ๋ฐ๋ผ์ก๊ฒ ๋จ. |
| 9 | +
|
| 10 | +*์๊ฐ ๋ณต์ก๋์ ๊ณต๊ฐ ๋ณต์ก๋ |
| 11 | +์๊ฐ ๋ณต์ก๋: O(n) |
| 12 | +์ฌ์ดํด์ด ์๋ ๊ฒฝ์ฐ: ๋น ๋ฅธ ํฌ์ธํฐ๊ฐ n/2๋ฒ ์ด๋ํ์ฌ ๋์ ๋๋ฌํ๋ฏ๋ก O(n) |
| 13 | +์ฌ์ดํด์ด ์๋ ๊ฒฝ์ฐ: ์ต์
์ ๊ฒฝ์ฐ ์ฌ์ดํด ๋ด์์ ๋๋ฆฐ ํฌ์ธํฐ์ ๋น ๋ฅธ ํฌ์ธํฐ๊ฐ ๋ง๋ ๋๊น์ง ์ฌ์ดํด ๊ธธ์ด๋งํผ ์ถ๊ฐ๋ก ์ด๋ํ์ง๋ง, ์ ์ฒด์ ์ผ๋ก๋ ์ฌ์ ํ O(n) |
| 14 | +
|
| 15 | +๊ณต๊ฐ ๋ณต์ก๋: O(1) |
| 16 | +๋ ๊ฐ์ ํฌ์ธํฐ ๋ณ์๋ง ์ฌ์ฉํ๋ฏ๋ก ์์ ๊ณต๊ฐ๋ง ํ์ |
| 17 | +์
๋ ฅ ํฌ๊ธฐ์ ๊ด๊ณ์์ด ์ผ์ ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ |
| 18 | +
|
| 19 | +''' |
| 20 | + |
| 21 | +class Solution: |
| 22 | + def hasCycle(self, head: Optional[ListNode]) -> bool: |
| 23 | + # ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ๋น์ด ์๊ฑฐ๋ ๋
ธ๋๊ฐ ํ๋๋ฟ์ด๋ฉด ์ฌ์ดํด์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก False ๋ฐํ |
| 24 | + if not head or not head.next: |
| 25 | + return False |
| 26 | + |
| 27 | + # ๋ ํฌ์ธํฐ๋ฅผ ๋ชจ๋ head์์ ์์ํ๋๋ก ์ด๊ธฐํ |
| 28 | + slow = head # ๋๋ฆฐ ํฌ์ธํฐ (๊ฑฐ๋ถ์ด) |
| 29 | + fast = head # ๋น ๋ฅธ ํฌ์ธํฐ (ํ ๋ผ) |
| 30 | + |
| 31 | + # ๋น ๋ฅธ ํฌ์ธํฐ๊ฐ ๋ ์นธ์ฉ ์ด๋ํ๋ฏ๋ก, fast์ fast.next ๋ชจ๋ ์กด์ฌํ๋์ง ํ์ธ |
| 32 | + while fast and fast.next: |
| 33 | + slow = slow.next # ๋๋ฆฐ ํฌ์ธํฐ๋ ํ ์นธ์ฉ ์ด๋ |
| 34 | + fast = fast.next.next # ๋น ๋ฅธ ํฌ์ธํฐ๋ ๋ ์นธ์ฉ ์ด๋ |
| 35 | + |
| 36 | + # ๋ ํฌ์ธํฐ๊ฐ ๊ฐ์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ฉด ์ฌ์ดํด์ด ์กด์ฌํจ์ ์๋ฏธ |
| 37 | + if slow == fast: |
| 38 | + return True |
| 39 | + |
| 40 | + # ๋น ๋ฅธ ํฌ์ธํฐ๊ฐ ๋์ ๋๋ฌํ๋ฉด ์ฌ์ดํด์ด ์๋ค๋ ์๋ฏธ |
| 41 | + return False |
| 42 | + |
| 43 | + |
0 commit comments