ダブルポインタ方式循環リンクリストII

トピック

LeetCode142。循環リンクリストII

リンクリストを指定して、リンクリストがループに入り始める最初のノードを返します。リンクリストにリングがない場合は、nullが返されます。

特定のリンクリスト内のリングを表すために、整数posを使用して、リンクリストの終わりがリンクリストに接続されている位置を示します(インデックスは0から始まります)。posが-1の場合、リンクリストにリングはありません。posはリングを識別するためにのみ使用され、パラメーターとして関数に渡されないことに注意してください。

注:指定されたリンクリストを変更することは許可されていません。

上級:

O(1)空間を使用してこの問題を解決できますか?

例1:

ここに画像の説明を挿入します

入力:head = [3,2,0、-4]、pos = 1
出力:インデックス1のリンクリストノードを返します
説明:リンクリストにリングがあり、そのテールは2番目のノードに接続されています。
例2:

ここに画像の説明を挿入します

入力:head = [1,2]、pos = 0
出力:インデックス0のリンクリストノードを返します。
説明:リンクリストに、テールが最初のノードに接続されているリングがあります。
例3:
ここに画像の説明を挿入します

入力:head = [1]、pos = -1
出力:nullを返します
説明:リンクリストにリングがありません。

促す:

リンクリスト内のノード数の範囲は[
0、104 ] -105 <= Node.val <= 105
の範囲です。posの値は-1またはリンクリスト内の有効なインデックスです。

問題解決のアイデアとアルゴリズム

ここに画像の説明を挿入します

コード

public class Solution {
    
    
    public ListNode detectCycle(ListNode head) {
    
    
        ListNode pos = head;
        Set<ListNode> visited = new HashSet<ListNode>();
        while (pos != null) {
    
    
            if (visited.contains(pos)) {
    
    
                return pos;
            } else {
    
    
                visited.add(pos);
            }
            pos = pos.next;
        }
        return null;
    }
}

ここに画像の説明を挿入します

コード

public class Solution {
    public ListNode detectCycle(ListNode head) {
        if (head == null) {
            return null;
        }
        ListNode slow = head, fast = head;
        while (fast.next!=null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (fast == slow) {
                ListNode ptr = head;
                while (ptr != slow) {
                    ptr = ptr.next;
                    slow = slow.next;
                }
                return ptr;
            }
        }
        return null;
    }
}

おすすめ

転載: blog.csdn.net/a12355556/article/details/113445689