Skip to content

Commit 1b405e0

Browse files
committed
add solution : 141. Linked List Cycle
1 parent f2b9477 commit 1b405e0

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed

linked-list-cycle/mmyeon.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
class ListNode {
2+
val: number;
3+
next: ListNode | null;
4+
constructor(val?: number, next?: ListNode | null) {
5+
this.val = val === undefined ? 0 : val;
6+
this.next = next === undefined ? null : next;
7+
}
8+
}
9+
10+
/**
11+
* @link https://leetcode.com/problems/linked-list-cycle/description/
12+
*
13+
* 접근 방법 :
14+
* - 노드 순회하면서 방문한 노드에 저장
15+
* - 방문할 노드가 이미 방문한 노드에 있으면 순환 구조 이므로 true 리턴
16+
*
17+
* 시간복잡도 : O(n)
18+
* - 순환 이전 노드의 개수 n만큼 순회하면서 순환 여부 확인
19+
*
20+
* 공간복잡도 : O(n)
21+
* - visited set에 순환되기 이전 노드 n개 저장
22+
*/
23+
function hasCycle(head: ListNode | null): boolean {
24+
const visited = new Set<ListNode>();
25+
let current = head;
26+
27+
while (current !== null) {
28+
if (visited.has(current)) return true;
29+
30+
visited.add(current);
31+
current = current.next;
32+
}
33+
34+
return false;
35+
}
36+
37+
/*
38+
* 접근 방법 :
39+
* - 공간복잡도 O(1)로 풀이
40+
* - 사이클이 있으면 두 포인터가 결국 같은 노드를 가리키게 되므로 투 포인터 사용
41+
* - 사이클이 없는 경우를 위해서 tail노드의 null체크를 해야함
42+
*
43+
* 공간복잡도 : O(1)
44+
* - 추가 메모리없이 slow, fast 포인터만 사용하므로 O(1)
45+
*/
46+
function hasCycle(head: ListNode | null): boolean {
47+
let slow = head;
48+
let fast = head;
49+
50+
while (fast !== null && fast.next !== null) {
51+
slow = slow.next;
52+
fast = fast.next.next;
53+
54+
if (slow === fast) return true;
55+
}
56+
57+
return false;
58+
}

0 commit comments

Comments
 (0)