LeetCode - 141. Linked List Cycle(Linked List, Two Pointers, HashTable)*


質問する


リンクリストの先頭を指定した場合は、リンクリストにループがあることを確認します.
リスト内のノードが再び到着できる場合、リンクリストには次のポインタを追跡し続けるループがあります.内部ではposは、次のポインタに接続されたノードのインデックスを表すために使用されます.posはパラメータとして渡されません.
リンクリストにライフサイクルが含まれている場合はtrueを返します.そうでなければfalseが返されます.
https://leetcode.com/problems/linked-list-cycle/
Given head, the head of a linked list, determine if the linked list has a cycle in it.
There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the next pointer. Internally, pos is used to denote the index of the node that tail's next pointer is connected to. Note that pos is not passed as a parameter.
Return true if there is a cycle in the linked list. Otherwise, return false.
Example 1:

Input: head = [3,2,0,-4], pos = 1
Output: true
Explanation: There is a cycle in the linked list, where the tail connects to the 1st node (0-indexed).
Example 2:

Input: head = [1,2], pos = 0
Output: true
Explanation: There is a cycle in the linked list, where the tail connects to the 0th node.
Example 3:

Input: head = [1], pos = -1
Output: false
Explanation: There is no cycle in the linked list.

に答える


これはJavaです.
  • LinkedListの各ノードは異なるオブジェクトである.
  • Two Pointers
  • クイックポインタとスローポインタを作成します.
  • ライフサイクルがない場合、クイックポインタは接続リストの最後に停止します.
    ループが存在する場合、高速ポインタは低速ポインタと出会う.
  •  public class Solution {
        public boolean hasCycle(ListNode head) {
            
            ListNode fast = head;
            ListNode slow = head;
            
            while(fast!=null && fast.next!=null){
                fast=fast.next.next;
                slow=slow.next;
                if(fast==slow) return true;
            }
            
            return false;
        }
    }
    HashSet
  • HashSetの値が重複しない特性を利用する.
  • public class Solution {
        public boolean hasCycle(ListNode head) {
            
            HashSet<ListNode> set = new HashSet<>();
            ListNode node = head;
            
             while(node!=null){
                 if(set.contains(node)) return true;
                 set.add(node);
                 node = node.next;
            }
            return false;
    
        }
    }
    LinkeListの各ノードは異なるオブジェクトであり,単純なノードである.val値の比較のみを試みます.各ノードは異なるオブジェクトです.