2つの数値を追加する2

 

  • 与えられた二つの非空リストは二つの非負整数を表すために使用される:ことステム。ここで、それぞれのビットは、方法の逆の順序で格納され、それらは各ノードが一つだけ桁を格納することができます。我々はこれらの2つの数値を合計した場合、それは新しいリストを返しますし、それらを表現します。あなたは数字0に加えて、これらの二つの数字が0で始まっていないと仮定することができます。

  • 例:

    入力:(2 - > 4 - > 3)+(5 - > 6 - > 4)
    出力:7 - > 0 - > 8 
    原因:342 + 465 = 807
  •  

    出典:滞在ボタン(LeetCode) 

  • 難易度:穏健派
  • 構造与えられたタイトルリスト
    / **
     *重リンクリストのための定義。
     *構造体ListNode {
     * int型のval;
     * ListNode *次の;
     * ListNode(INT X):ヴァル(x)は、次の(NULL){}
     *}。
     * /
  • ソリューションの概要:この問題の一般的な考え方は、二つのリストの各桁を通じて個別にあり、これら二つのリストは、L1、加算演算値の中央値にL2対応が新たに、計算、ポインタの後に開かれたにリンクされているリストに保存されていますこれは、操作を継続するために次の桁を指します。この時点で、いくつかの質問を考えるのは簡単です:1.これら二つのリストの長さが行う方法と同じではありませんか?2.対応するビットが追加された場合の対処する方法10以上を運ぶ必要がありますか?
  • 実装:我々はノード毎にwhileループを使用する必要があるので、私は具体的なアイデアを見たいのですが、今あなたが使用した方法を選択したい、最初にすべての、私たちは新しいリストを開く必要があり、トラバースL1、L2リストに必要しばらく、しかし、未知の長さのリストトラバーサル、サイクルの終わりそれ?それは2の2つの問題を解決する方法によって異なります。ノードL1がある場合は、その後、一緒にその値を入れノードL2がある場合一方、第1の課題を解決するために、我々は、その値を一緒に入れ、その後、裁判官へのステートメントを使用することができます。第二の問題のために、我々は、L1->ヴァル+ L 2 - >値> = 10の場合には、新たな始まりとして次のノードリストにキャリーフラグが1に設定し、割り当てている追加、キャリーフラグ追加= 0を設定することができ値、L1->ヴァル+ L2->ヴァル-10現在、新しいリストに割り当てられました。後の操作手順は、我々は、入力と出力を見て、特定を終了するには、我々は、未使用のヘッドノードで、新しいリストを作成するというその問題を見つけるでしょう。だから、とき、最終的な出力が削除されるべきです。
  • 次のソースコード:
  • 1  / * *
     2  *片方向リンク・リストのための定義
     。3  *構造体ListNode {
     4  * INTヴァル;
     5。 * ListNode *次、
     6。 * ListNode(INT X):ヴァル(X)、次に(NULL){}
     7。 * };
     8。  * / 
    9  クラスソリューション{
     10  公共11      ListNodeのaddTwoNumbers *(L1 * ListNode、ListNode * L2){ 
     12は          ListNode *結果= 新しい新しい ListNode(0)は、R * = 結果; //新しいリスト定義
     13である         INT =追加0 ; //はキャリーフラグを定義します
    14          ながら(!= NULL || L2 L1 = NULL){//リスト・トラバーサルのいずれかが完了していない場合
     15              R->次に= 新しい新しいListNode(ADD); //進歩は、新たに開かれたリスト運ぶために割り当てられた
     16              R&LT =をR-> 次に、 
     図17  
    18である             IF(!= L1 NULL){L1がトラバースされていない場合//
     。19                  R->ヴァル= R->ヴァル+ L1-> ヴァル;
     20は、                  L1 = L1-> 次に、
     21である             }
     22は、             IF(!L2 = NULL){//終了L2ないトラバーサル場合
     23はしない                  R->ヴァル= R->ヴァル+ L2-> ヴァル;
     24                  L2 = L2-> 次に;
     25              }
     26 IS 
    27              IF(R->ヴァル> = 10 ){//キャリーがある場合
     28                  R->ヴァル= R-> Val- 10 ;
     29                  追加= 1。;
     30              }
     31が             {//ならないキャリー
     32                  追加= 0 33である             }
     34である         }
     35          IF(ADD> 0 ){//最後に、最終のキャリービット場合
     36              R->次に= 新しい新しいListNode(ADD);
     37          }
     38は、         戻り result-> 次に; //注リターンリードありませんノードのリンクリスト
     39     }
     40 }。

     

  • 概要:この質問は、主として、検査リストを使用するには、難しいことではありません。

 

おすすめ

転載: www.cnblogs.com/ak918xp/p/12459816.html