문제링크: https://leetcode.com/problems/linked-list-cycle/
연결리스트가 사이클이 있는지 확인하는 문제다.
방문한 노드를 Set에 저장하고 해당 노드를 다시 방문했는지를 확인해 Cycle이 있는지 판별한다.
cur
에 현재 노드를 지정하고 Set에 포인터를 저장한다.cur.next
로 다음 노드로 이동하고 Set에 접근해 이미 탐색한 곳인지 확인한다.var hasCycle = function(head) {
const mySet = new Set();
// 순회
let cur = head;
while (cur !== null) {
if (mySet.has(cur)) return true;
mySet.add(cur);
cur = cur.next;
}
return false;
};
Set에 노드 포인터를 저장하다보니 상대적으로 메모리가 많이 사용되었다. 노드의 개수에 따라 O(n)의 공간복잡도가 소요된다.
연결리스트를 탐색하는 속도가 다른 두개의 포인터를 사용한다. 만약 Cycle이 존재한다면 두 포인터의 속도가 다르기만 하다면 (대신 모든 노드를 탐색)동일 지점에서 결국 만나게 된다. 두 포인터가 만나는지 혹은 먼저 끝에 도달하는지 여부를 통해 Cycle을 판단할 수 있다.
var hasCycle = function(head) {
const mySet = new Set();
// 순회
let cur = head;
let fast = head;
while (fast && fast.next) {
cur = cur.next;
fast = fast.next.next;
if (cur === fast) return true;
}
return false;
};
노드에 따른 공간을 추가로 사용하지 않기 때문에 O(1)의 공간 복잡도를 가지게 된다.