[LeetCode 1171]リンクリストからゼロサム連続ノードを削除

与えられた  head リンクリストの、私たちは繰り返しノード合計との連続したシーケンスを削除し  0 、そのようなシーケンスが存在しなくなるまで。

そうした後、最終的にリンクリストの先頭を返します。あなたはそのような答えを返すことがあります。

 

(以下の例では、すべての配列がのシリアル化であることに留意されたい  ListNode オブジェクト)。

例1:

入力:ヘッド= [1,2、-3,3,1] 
出力:[3,1] 
注意:解答[1,2,1]も受け入れられるでしょう。

例2:

入力:ヘッド= [1,2,3、-3,4] 
出力:[1,2,4]

例3:

入力:ヘッド= [1,2,3、-3、-2] 
出力:[1]

 

制約:

  • 与えられたリンクリストには間が含まれます  1 と  1000 、ノード。
  • リンクリスト内の各ノードはあり  -1000 <= node.val <= 1000

 

 

ソリューション1つのポインタ、O(N ^ 2)実行時、O(1)スペース

1.左右のポインタLとRを持っています。また、Lの前のノードであるprevLと呼ばれるポインタを初期化。

最初のノード2.開始L、一度にRつのノードを移動させます。Rが訪問している各ノードに対して、次の2つの場合があろう。

A。実行中の合計が0である場合、Rの次のノードにprevLの次のポインタを設定することにより、包括LからRへのすべてのノードを削除します。次にRにLを更新します。

B。他に、LにprevLを更新。

その次のノードへの前記移動l及びlはリンクされたリストの終わりに達するまでステップ2を繰り返します。

 

/ ** 
 *単一リンクリストのための定義。
 *パブリッククラスListNode { 
 * int型のval; 
 * ListNode次。
 * ListNode(INT X){ヴァル= X。} 
 *} 
 * / 
クラスソリューション{
     パブリックListNodeのremoveZeroSumSublists(ListNodeヘッド){ 
        ListNodeダミー = 新しい ListNode(+ 1〜1000×1000 )。
        dummy.next = ヘッド。
        ListNode prevL =ダミー、L =ヘッド、R = ヘッド。
        
        一方、(!L = NULL ){ 
            R = L。
            int型の合計= 0;
            ブールスキップ= ;
            一方、(!R = NULL ){ 
                合計 + = r.val。
                もし(合計== 0 ){   
                    prevL.next = r.next。
                    L = R。
                    スキップ = ;
                    破ります; 
                } 
                R = r.next。
            } 
            もし(!{スキップ)
                prevL = L。
            }             
            、L = l.next。
        } 
        戻りdummy.next。
    } 
}

 

 

HashMapの、O(N)実行時と空間を持つソリューション2.プレフィックス合計

1.値0のダミーノードとノードにprefixsumをマップするハッシュマップを作成します。

2.ダミーノード、現在のノードで終わる計算プレフィックス和からスタート。

すでにハッシュマップ内の同じ値のプレフィックス合計が存在する場合、我々はmap.get(prefixSum)からのすべてのノードがmap.get(prefixSum)によって、これらすべてのノードを削除して0に、現在のノード(包括的)の和に.next知っています.next = curr.next。これらのノードが削除されているので、我々は、マップからこれらの削除されたノードで終わるすべてのプレフィックスの合計を削除する必要があります。 

そうでなければ、後でチェックのためのマップに現在の接頭辞の和とノードを置きます。

 

/ ** 
 *単一リンクリストのための定義。
 *パブリッククラスListNode { 
 * int型のval; 
 * ListNode次。
 * ListNode(INT X){ヴァル= X。} 
 *} 
 * / 
クラスソリューション{
     パブリックListNodeのremoveZeroSumSublists(ListNodeヘッド){ 
        ListNodeダミー = 新しい ListNode(0)、CURR = ダミー。
        地図 <整数、ListNode>マップ= 新しい HashMapの<> (); 
        dummy.next = ヘッド。
        int型 prefixSum = 0 ;
        しばらく(CURR!= nullを){
            prefixSum 
                map.put(prefixSum、CURR)。+ = curr.val。
            もし(map.containsKey(prefixSum)){ 
                ListNodeノード = map.get(prefixSum).next。
                int型の合計= prefixSum。
                一方、(!ノード= CURR){ 
                    合計 + = node.val。
                    map.remove(合計)。
                    ノード = node.next。
                } 
                map.get(prefixSum).next = curr.next。
            } 
            { 
            } 
            CURR = curr.next。 
        } 
        戻りdummy.next。
    } 
}

 

おすすめ

転載: www.cnblogs.com/lz87/p/11605711.html