알고리즘 문제 풀이: 자바/LeetCode

141. Linked List Cycle

hueco 2026. 1. 24.

 

📌 Problem Link :

https://leetcode.com/problems/linked-list-cycle/description/

Accepted :

public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null) return false;

        ListNode current = head;

        while (current.next != null) {
            if (current.val == 100001) return true;
            current.val = 100001;
            current = current.next;
        }
        return false;
    }
}

 

🧐 Review :

리트코드 141번 문제는 주어진 연결 리스트(Linked List) 내에 순환(Cycle)이 존재하는지 판별하는 문제입니다.

 

1. 첫 번째 접근 방식 :

처음에는 연결 리스트를 순회하며 각 노드의 val을 문제에서 정한 범위를 벗어나는 임의의 값으로 업데이트하는 방식을 생각했습니다.
순회 중 이미 업데이트된 값을 가진 노드를 다시 만난다면, 해당 리스트에 순환이 존재한다고 판별하는 로직이었습니다.

 

2. 피드백 및 개선 :

하지만 코드 리뷰를 통해 원본 데이터(노드의 값)를 직접 수정하는 방식은 문제의 의도에서 벗어날 수 있다는 점을 알게 되었습니다. 실제 실무 환경에서도 읽기 전용 데이터일 경우 이 방식은 적용하기 어렵기 때문입니다.

 

3. 최종 풀이:

이를 보완하기 위해 'Floyd’s Cycle Detection(플로이드의 순환 탐색)' 알고리즘을 도입했습니다.

이 알고리즘의 핵심은 속도가 다른 두 개의 포인터를 사용하는 것입니다. 

public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) {
            return false;
        }

        ListNode slow = head;
        ListNode fast = head;

        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;

            if (slow == fast) {
                return true;
            }
        }

        return false;
    }
}

 

  • slow 포인터: 한 번에 한 칸씩 이동합니다.
  • fast 포인터: 한 번에 두 칸씩 이동합니다.

만약 리스트에 순환이 존재한다면, 속도가 빠른 fast 포인터가 어느 시점에는 반드시 slow 포인터를 뒤따라 잡게 됩니다.

즉, 두 포인터가 동일한 노드에서 만나는 순간 순환이 있음을 확신할 수 있습니다. 반면, 리스트의 끝(null)에 도달하면 순환이 없는 것으로 판단합니다.

 

'알고리즘 문제 풀이: 자바 > LeetCode' 카테고리의 다른 글

136. Single Number  (1) 2025.12.17
649. Dota2 Senate  (0) 2025.12.02
1137. N-th Tribonacci Number  (1) 2025.11.25
724. Find Pivot Index  (0) 2025.11.22
1. Two Sum  (0) 2025.11.22

댓글