File tree Expand file tree Collapse file tree 1 file changed +64
-0
lines changed Expand file tree Collapse file tree 1 file changed +64
-0
lines changed Original file line number Diff line number Diff line change
1
+ // 주어진 연결 리스트에서 사이클이 있는지 판단하는 문제
2
+ // 사이클: 연결 리스트의 어떤 노드가, 이전에 방문했던 노드를 다시 가리키는 경우
3
+
4
+ // 문제접근:
5
+ // 1) hashset : 직관적
6
+ // 2) two pointers : 플로이드의 사이클 탐지 알고리즘(토끼와 거북이 알고리즘)
7
+
8
+ /**
9
+ * Definition for singly-linked list.
10
+ * function ListNode(val) {
11
+ * this.val = val;
12
+ * this.next = null;
13
+ * }
14
+ */
15
+
16
+ /** two pointers로 접근
17
+ * 시간복잡도: O(n)
18
+ * 공간복잡도: O(1) - ✅ follow-up 고려
19
+ * @param {ListNode } head
20
+ * @return {boolean }
21
+ */
22
+ var hasCycle = function ( head ) {
23
+ if ( ! head || ! head . next ) return false ;
24
+
25
+ let slow = head ; // 거북이: 한 칸씩
26
+ let fast = head ; // 토끼: 두 칸씩
27
+
28
+ while ( fast && fast . next ) {
29
+ slow = slow . next ; // 한 칸 이동
30
+ fast = fast . next . next ; // 두 칸 이동
31
+
32
+ // 두 포인터가 만나면 사이클 존재한다
33
+ if ( slow === fast ) {
34
+ return true ;
35
+ }
36
+ }
37
+
38
+ return false ;
39
+ } ;
40
+
41
+ /**
42
+ * hashset으로 접근
43
+ * 시간복잡도: O(n)
44
+ * 공간복잡도: O(n)
45
+ */
46
+ var hasCycle2 = function ( head ) {
47
+ if ( ! head ) return false ;
48
+
49
+ const visited = new Set ( ) ;
50
+ let current = head ;
51
+
52
+ while ( current ) {
53
+ // 이미 방문한 노드라면 사이클 존재한다
54
+ if ( visited . has ( current ) ) {
55
+ return true ;
56
+ }
57
+
58
+ // 현재 노드를 방문 기록에 추가
59
+ visited . add ( current ) ;
60
+ current = current . next ;
61
+ }
62
+
63
+ return false ;
64
+ } ;
You can’t perform that action at this time.
0 commit comments