본문 바로가기
Leetcode

141. Linked List Cycle

by Doromi 2023. 11. 5.
728x90
반응형
주어진 연결 리스트(링크드 리스트)에 순환(사이클)이 존재하는지 여부를 판단하는 문제입니다.

문제 설명:

주어진 연결 리스트에 순환(사이클)이 존재하면 true를, 순환이 존재하지 않으면 false를 반환하세요.

연결 리스트는 각 노드가 데이터와 다음 노드를 가리키는 링크로 구성됩니다. 순환(사이클)이 존재한다는 것은 연결 리스트에서 어떤 노드를 시작점으로 하더라도 해당 노드를 지나면 언젠가 다시 동일한 노드에 도달할 수 있다는 것을 의미합니다.

예를 들어, 다음과 같은 연결 리스트가 순환을 가지고 있으면 true를 반환해야 합니다:
3 -> 2 -> 0 -> 4
     ^         |
     |         v
     +---------+

 

반면에, 순환을 가지지 않는 연결 리스트는 다음과 같습니다:
1 -> 2 -> 3 -> 4
순환을 판단하기 위해 해시 테이블을 사용하거나 투 포인터(Two Pointers) 기법을 활용할 수 있습니다. 두 포인터를 사용하여 한 포인터는 한 번에 한 단계씩, 다른 포인터는 한 번에 두 단계씩 이동하게 하고, 만약 순환이 존재하면 두 포인터가 언젠가 만나게 됩니다.

이 문제를 해결하는 가장 일반적인 방법은 투 포인터를 사용하는 것
public class ListNode {
    public int val;
    public ListNode next;
    public ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

public bool HasCycle(ListNode head) {
    if (head == null || head.next == null) {
        return false; // 빈 리스트나 단일 노드는 순환이 없음
    }
    
    ListNode slow = head;
    ListNode fast = head.next;
    
    while (slow != fast) {
        if (fast == null || fast.next == null) {
            return false; // fast 포인터가 리스트의 끝에 도달하면 순환 없음
        }
        slow = slow.next;
        fast = fast.next.next;
    }
    
    return true; // slow와 fast 포인터가 만났으므로 순환 있음
}
투 포인터를 사용하여 연결 리스트에서 순환 여부를 판단하며, 만약 순환이 존재한다면 true를, 그렇지 않으면 false를 반환합니다.
728x90
반응형

'Leetcode' 카테고리의 다른 글

168. Excel Sheet Column Title  (0) 2023.11.06
145. Binary Tree Postorder Traversal  (0) 2023.11.05
110. Balanced Binary Tree  (0) 2023.11.04
70. Climbing Stairs  (0) 2023.11.03
101. Symmetric Tree  (0) 2023.11.01