LeetCodeブラシタイトル:循環リンクリストII(day33)

LeetCodeブラシタイトル:循環リンクリストII(day33)

件名の説明:

リストを考えると、チェーンリングの初めに最初のノードを返します。鎖非環式ならば、それが返されます  null

リングを与えられたリストを表示するために、我々は、整数を使用して  pos リストのリストの最後(インデックス0から始まる)に接続された位置を示します。場合  pos で  -1、このリストにはループがありません。

説明:指定されたリストを変更することはできません。

例1:

输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。

例2:

输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。

例3:

输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。

問題解決のアイデア:

        ポインタ・リングが存在する場合、2つのステップは、速度は、第一の方法リストによって決定され、次のリングは、リングの最初のノードを見つけた場合。

        具体的方法、出発点は、最初の環A内の最初のノードのリストの長さは、(不明)であるとすると、ノードBのポインタの長さは、(A + B)(この長さが知られている)の速度を満たすために。今、私たちはの価値を知りたい、我々は速いポインタP2が2倍遅くなることに注意いつも遅いポインタp、ポインタpの長さを歩いてあなただけの1を取ればBから行くし続ける(A + B)、B点に戻ることができます長さは、ノードAに戻ることができるようになります しかし、の値が知られていない、Quxianjiuguoソリューションであり、長さAに対する出発点は、その後qは遅いポインタpの先頭から新たなポインタであるとノードBの同期から歩行開始することができることに注意し、成立環A内の最初のノードである必要があり、ローカル

コードの場合:

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
         // 步骤一:使用快慢指针判断链表是否有环
        ListNode p = head, p2 = head;
        boolean hasCycle = false;
        while (p2 !=null && p2.next != null && p2.next.next != null) {
            p = p.next;
            p2 = p2.next.next;
            if (p == p2) {
                hasCycle = true;
                break;
            }
        }

        // 步骤二:若有环,找到入环开始的节点
        if (hasCycle) {
            ListNode q = head;
            while (p != q) {
                p = p.next;
                q = q.next;
            }
            return q;
        } else 
            return null;
    }
}

結果:

時間のかかります:

おすすめ

転載: blog.csdn.net/weixin_44083005/article/details/90770002