数2] [01 LeetCode学習記録和(Java実装)

2. 2つの数値(Java実装)

タイトル:二つの非空リストを与えは、二つの非負整数を表すために使用されます。その中でも、それぞれの中央値に従った方向の保管の、そして、彼らは、各ノードにのみ保存することができます1桁。

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

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

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

コード大物見た後アイデアを更新

アイデア:

  • 987 + 23 = 987 + 023 = 1010:リストはフロントフィル0、例えばで短い場合は二つのリストは、トラバースの長さと同じです
  • 同時に、キャリー上の問題を検討するためにあらゆるコンピューティングの必要性が、また、キャリー・ビット・コンピューティングの終了後に現在の値を更新する必要があります
  • すべてのトラバーサルの二つのリストが完了している場合は、キャリー値は、新しいノード1を追加するリストの最前線に、1です。あなたは結果そうにかかわらず、中央のあなたが運ぶどのくらいのリターンへのビットリストのビットに基づいており、終わるので、ここでは、説明すること、これらのキャリーは、あなたは、私たちは新しい希望、キャリーがある場合は、最後の1まで計算にリストに追加しました(ヴァル= 1)ノードを挿入します。
  • 最後の構造は、結果のリストを返しました。白は、Javaで動作してリストされていることを、このステップでは、問題の深い理解でなければなりません:参照Javaはオブジェクト内のオブジェクトそれが明確でない場合は、参照オブジェクトと参照がJavaで話します簡単に言えば、我々は最初のヘッドにヘッダーオブジェクト、2つの参照ヘッド、一時ポイントを作成します。次に、ヘッドは、新しいオブジェクト(ノード)をリンクするためのツールとして一時人々動かない(= newNodeのtemp.nextを;) その後、リンクリストのノードポイントの尾は、*(温度= temp.next;)* 。ヘッドポイントリストの先頭には、結果を返すために使用されてきました。注:ヘッドノードは、結果の一部ではないので、それはhead.nextを返します
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //创建一个头结点对象
        ListNode head = new ListNode(0);
        //两个引用head和temp都指向这个对象,head用来指向链表头,temp是工具人(有点像C语言中移动的指针)
        ListNode temp = head;
        //进位标志carry
        int carry = 0;
        //每一位的求和sum
        int sum =0;
        while(l1!=null||l2!=null){
            int x = null==l1?0:l1.val;
            int y = null==l2?0:l2.val;
            sum = x+y+carry;
            //计算本位是否有进位
            carry = sum/10;  
            //插入本位的计算结果
            ListNode newNode = new ListNode(sum%10);
            //将新结点插入到链表中
            temp.next=newNode;
            //指针移动,temp一直指向链表的尾部
            temp = temp.next;
            if(l1 != null)
                l1 = l1.next;
            if(l2 != null)
                l2 = l2.next;
        }
        //最高位如果有进位,则插入一个新结点(val=1)
        if(carry>0){
            temp.next = new ListNode(carry);
        }
        //head指向的头结点不是结果的一部分,真正的返回结果从head.next开始
        return head.next;
       
    }
}
  • 結果:
    ここに画像を挿入説明
  • 私は、私のような多くの人が、私は再びヘッドノードを削除しないで、私のリストは結果である無用ヘッドノードたいべき理由head.nextは、非常に不幸な感じ見て信じています。私は上記の問題を解決するために、上記のコードを少し変更されますので、それは実際には非常に簡単です、ライン上で裁判官を追加します。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = null;
        ListNode temp = null;
        //进位标志carry
        int carry = 0;
        //每一位的求和sum
        int sum =0;
        while(l1!=null||l2!=null){
            int x = null==l1?0:l1.val;
            int y = null==l2?0:l2.val;
            sum = x+y+carry;
            //计算本位是否有进位
            carry = sum/10;  
            //插入本位的计算结果
            ListNode newNode = new ListNode(sum%10);
            //将新结点插入到链表中
            //如果头结点为null,就将head指向新创建的结点
            if(head==null){
                head = newNode;
                temp = head;
            }else{
                temp.next=newNode;
                temp = temp.next;

            }
            if(l1 != null)
                l1 = l1.next;
            if(l2 != null)
                l2 = l2.next;
        }
        //最高位如果有进位,则插入一个新结点(val=1)
        if(carry>0){
            temp.next = new ListNode(carry);
        }
        //head指向的头结点不是结果的一部分,真正的返回结果从head.next开始
        return head.next;
       
    }
}
  • 結果:
    ここに画像を挿入説明

次のレコードの私自身の未熟さのアイデア

このトピックを参照してください、私が最初に考えた後、結果がリストに返され、結果を加算して得られた整数、にL1二つのリストを置くこと、であるとL2入力。(だから、愚かな方法は、あなただけの悲しいコーディング、通常はハード動作しない...アルゴリズムレベルを伝えることができます...とても良いコードああをノックします!)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        StringBuilder str1 = new StringBuilder();
        StringBuilder str2 = new StringBuilder();
       //遍历l1链表,存储到str1中
        while(l1!=null){
        str1.append(l1.val);
        l1=l1.next;
        }
        //遍历l2链表,存储到str2中
        while(l2!=null){
            str2.append(l2.val);
            l2=l2.next;
        }
       
        try{
            //将l1、l2中字符串逆序后准成int类型
            int r1 = Integer.parseInt(str1.reverse().toString());
            int r2 = Integer.parseInt(str2.reverse().toString());
            //求和得到结果
            int r = r1+r2;
            // System.out.println(r1+" + "+r2+"="+" "+r);
            //将结果r从低位到高位插入到结果链表中
            ListNode head = null;
            if(r==0){
                return new ListNode(0);
            }
            while(r!=0){
                ListNode newNode = new ListNode(r%10);
                if(head ==null) {
                    head = newNode; 
                }else {
                    ListNode tmp = head;
                    while(tmp.next!=null) {
                        tmp = tmp.next;
                    }
                    tmp.next = newNode;
                }
                r = r/10;
            }
             return head;
        }catch(Exception e){
        }    
     return null;
    }
}


  • 結果:
    ここに画像を挿入説明
    演算結果格納されたint型で、その値がint型の試験範囲を表すことができるよりもはるかに大きいですが、問題があります。私はいくつかの記事がを通じてのBigDecimalを使用し、長い作品にはないと述べ読みください。
リリース3元の記事 ウォンの賞賛2 ビュー34

おすすめ

転載: blog.csdn.net/qq_39754086/article/details/104817461