Leetcode Java Linked List Cycle II
업데이트:
문제
코드
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
class Solution {
public boolean hasCycle(ListNode head) {
if (head == null) {
return null;
}
ListNode fast = head;
ListNode slow = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
ListNode search = head;
while (slow != search) {
slow = slow.next;
search = search.next;
}
return search;
}
}
return null;
}
}
결과
설명
-
주어진 ListNode head가 순회의 시작점인 ListNode를 찾는 문제이다.
-
head가 null인 경우 순회가 불가능하므로, null을 주어진 문제의 결과로 반환한다.
-
검증을 위해 fast와 slow를 head를 주입하여 정의한다.
- fast와 fast.next가 null이 아닐 때 까지 반복하여 검증을 수행한다.
- fast에 fast.next.next 값을 주입하여 다다음 ListNode로 이동한다.
- slow에 slow.next 값을 주입하여 다음 ListNode로 이동한다.
- fast와 slow가 동일하면 순회가 되는 포인트가 있는 경우이므로, 순회의 시작점을 탐색한다.
- search 변수를 임시 정의하여 주어진 ListNode인 head를 주입한다.
- slow와 search가 동일한 결과가 나올 때 까지 slow와 search를 각각 다음 ListNode로 이동시킨다.
- 반복이 완료되면 순회의 시작점인 search를 주어진 문제의 결과로 반환한다.
- 모든 반복이 완료되고 결과가 나오지 않는 경우 순회가 되지 않는다는 의미이므로, null을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기