[LeetCode] Linked List Cycle

아르당·2025년 9월 16일

LeetCode

목록 보기
32/68
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

Problem

연결 리스트의 머리 head가 주어졌을 때, 연결 리스트에 사이클이 존재하는지 판별해라.
연결 리스트에 어떤 노드에서 next 포인터를 계속 따라갔을 때 다시 도달하는 노드가 있다면, 연결 리스트에는 사이클이 존재한다. 내부적으로 pos는 꼬리의 next 포인터가 연결된 노드의 인덱스를 나타내는 데 사용한다.
연결 리스트에 사이클이 존재하면 true를 반환하고, 그렇지 않다면 false를 반환해라.

Example

#1

Input: head = [3, 2, 0, -4], pos = 0
Output: true
Explanation: 연결 리스트에 사이클이 있고, 꼬리는 1번째 노드(0-index)에 연결되어 있다.

#2

Input: head = [1, 2], pos = 0
Output: true
Explanation: 연결 리스트에 사이클이 있고, 꼬리는 0번째 노드에 연결되어 있다.

#3

Input: head = [1], pos = 0
Output: false
Explanation: 연결 리스트에 사이클이 없다.

Constraints

  • 리스트에 노드의 숫자는 0에서 10^4 범위에 있다.
  • -10^5 <= Node.val <= 10^5
  • pos는 -1이거나 연결 리스트에 유효한 인덱스다.

Solved

투 포인터를 활용해서 문제를 풀었다.
slow는 1칸씩 이동하고, fast는 2칸씩 이동하게 하여 사이클이 존재한다면 만날 것이고, 사이클이 존재하지 않으면 만나지 않는다.

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        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;
    }
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글