2つの数値

2つの数値

カジュアルワーキング

我々は、二つの非空リストは二つの非負整数を表すために使用されて示されています。ここで、それぞれのビットは、方法の逆の順序で格納され、それらは各ノードが一つだけ桁を格納することができます。

 

我々はこれらの2つの数値を合計した場合、それは新しいリストを返しますし、それらを表現します。

 

あなたは数字0に加えて、これらの二つの数字が0で始まっていないと仮定することができます。

 

例:

 

入力:(2 - > 4 - > 3)+(5 - > 6 - > 4)

出力:7 - > 0 - > 8

理由:342 + 465 = 807

 

問題解決のためのコード

/ * * 
 。*片方向リンク・リストのための定義
 *構造体ListNode { 
 * INTヴァル; 
 *構造体ListNode *次に、
 *}; 
 * / 

構造体 ListNode * addTwoNumbers(構造体 ListNode * L1、構造体 ListNode * L2){
   / * 
    アイデア:
    同じトラバース二つのリストで1.二つのリストにまで空になるまで
    2.キャリー問題が考える
    ときにキャリー
    つのノード+および> 9キャリーの一方に搬送
    インサイチュは、(二つの数字となり+ )10%に運ぶ、キャリー/ 10)1キャリー+の2つの数字となる
    境界の場合を考慮してください。
    次のトラバースリスト1.のみポインタが空でない場合、それは次を指し
    2最後のビット位置に、キャリーは、エンドループないよう
  * / 
    構造体 ListNode * T1 = L1; // ポインタを横断すると、元のリストの変化しない
    構造体を* T2 = ListNode L2;
     構造体 ListNode * H3 =(構造体 ListNode *)はmallocはsizeof構造体 ListNode)); // 最初のノード
    構造体 ListNode * PNEW = NULL; // 新しいノード・アプリケーションを指す
    構造体 ListNode PTAIL = H3 * ; // リストの末尾にポイント
    のint SUM = 0 ; 
    H3 - >ヴァル= 0 ; 
    H3 - >次に= NULL; //は、第1ノード初期化
    INT =キャリー付き0 ; // フォワードつ運ぶ
    ながら(T1を|| || T2 キャリー付き)
    { 
        PNEW =(構造体 ListNode *)はmallocはsizeof構造体 ListNode)); // 新しいノードを要求 
        pNew->ヴァル= 0 ; 
        PNEW - >次= NULL; //は、新しいノードを申請し、ノードが初期化
        int型 = SUMを0 ; // 対応する用語及び
        IF(T1 = NULL!)// ポインタがトラバース前に空でない場合にのみ、プラス値
        { 
            SUM + = T1-> ヴァルを; 
        } 
        IF(!T2 = NULL)
        { 
            SUM + T2- => ヴァル; 
        } 
        SUM= +キャリーと、
         IF(SUM> = 10 
        { 
            SUM = SUM%10 ; // 剰余 
            キャリー付き= 1 ; // キャリー
        }
         
        { 
            キャリー付き = 0 ; // キャンセルキャリー
        } 
        PNEW - >ヴァル= SUM;
         // 新しいです結果のリストにノード 
        pTail->次= PNEW; // 最新のリストの挿入端 
        PTAIL = PNEW; // エンド・ノードに移動
         // 下方リストを横断
        IF(!T1 = NULL)//それは次のノードを指す空でない
        { 
            T1 = T1-> ;次に
        } 
        IF(T2 =!NULL)
        { 
            T2 = T2-> 次に; 
        } 
        
    } 
    構造体 H3->のListNode * = TEMP2 次に、
     フリー(H3); // 最初のノードの空のリリース
    リターンのTEMP2; // 戻り値のリストを 
}

ペイント解析

アイデア解析

全体として、それぞれ、第1ノードL1及びL2であるように2つのリストの合計。ノードに対応する各ノードの配列リストは、少数のヘッドであり、対応するテイルノード番号が高いです。私たちの目的は、各ビットは結果あなたのリストに対応する2つの数の和の結果に対応して、このリストを、追加することによって、二つのリストを配置キャリーケースを考え、新しいリストで終わることです。

 

示されるように、L1は、ハイからロー1984がハイからローにL2および52です。二つの数2036の加算結果は、2036年にはハイからローに正確L3に対応します。

 

その後、我々は、我々がローからハイにカウントを開始、プロセスを分析キャリーを運びます。

* 0初期キャリーはCARRAY = 0、0であります

* 4 + 2 +キャリー= 4 + 2 + 0 = 6 0 =運ぶ搬送しません。

キャリー= 1に* 8 + 5 +キャリー= 8 + 5 + 0 = 13; 10 = 3が13%です

*キャリー= 1に9 + 0 +キャリー= 9 + 0 + 1 = 10; 10 = 0が10%です。

* 1 + 0 +キャリー= 1 + 0 + 1 = 2バイナリ0

 

コード分​​析

1.できるだけ簡単にするために、我々は最終結果を保存するための新しいリストを作成し、リストの先頭ポインタを返します

2.プロセスを通じて渡された2つのリストを変更しないでください

3.我々は2つのリストを横断する必要があります

  • それが終了すると?の2つの条件が不可欠です
  • 二つのリストが空のときです
  • 0時間キャリー

4.たびに新しいノードを適用します

  • ノードの新しい値は、そうでなければ二つのノード+の値を運ぶ、2つのノードが残りを取るためにキャリー値+> 9の値に対応する場合は?数えます
  • 2つのノードが+> 1つの9キャリーのキャリー値の値に対応する場合は?を検討、または0を運ぶためにどのようにキャリー
  •  nullにリンクリストポインタのポイントを通過するが、どのように行うには場合にも、問題を考慮すべきことは?ポインタだけを横断して値を追加する前に、空を指していません

5.シーケンスに対応するように、新しいリスト、テール補間を挿入します。

ポインタのみを横断する場合のポインタ移動、トラバース6がnullでありません

 

おすすめ

転載: www.cnblogs.com/mengxiaoleng/p/11374094.html