본문 바로가기
알고리즘/문제 풀이

[Leetcode] 141. Linked List Cycle

by 위대한초밥V 2023. 11. 12.

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

설명

이 문제는 주어진 리스트 노드가 싸이클이 있는지 확인하는 문제이다.

 

토끼와 거북이 알고리즘을 사용하면 된다.

https://fierycoding.tistory.com/45

 

플로이드의 토끼와 거북이 알고리즘(Floyd's Tortoise & Hare Algorithm) / 증명 / leetcode 287번 / 파이썬

발단 어느날 나의 유튜브 알고리즘에 뜬 JOMA... 사실 예전에도 한 번 본 적 있는 영상인데 그때는 킬킬킬 웃고 넘어갔지만 이제와서 다시 보니 알고리즘의 내용이 궁금해졌습니다. 결국엔 알아보

fierycoding.tistory.com

 

주어진 노드를 fast, slow라고 붙이고

fast 노드는 2씩 움직이고, slow는 1씩 움직이다. 

만약! 사이클이 있다면, fast와 slow는 cycle 안에서 무한히 돌 것이다. 

그리고 어느순간에 fast가 slow보다 많이 돌아서 만나는 지점이 있을 것이다.

만약 무한히 돌지 않고 어느 순간 fast 노드가 null을 마주한다면 사이클이 존재하지 않은 것이므로 false를 리턴한다.

 

코드

 

/**
 * 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 fast = head, slow = head;

        while(true) {
            if(fast == null) return false;
            if(fast.next == null) return false;

            fast = fast.next.next;
            slow = slow.next;

            if(fast == slow) return true;
        }
    }
}
반응형