https://leetcode.com/problems/linked-list-cycle/
설명
이 문제는 주어진 리스트 노드가 싸이클이 있는지 확인하는 문제이다.
토끼와 거북이 알고리즘을 사용하면 된다.
https://fierycoding.tistory.com/45
주어진 노드를 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;
}
}
}
반응형