二つの数(2つ)の追加

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

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

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

例:

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

ソリューション

アイデア:

  • タグ:リスト
  • 二つのリストは、トラバースの長さと同じである場合、先頭にゼロに短いリスト、などの987 + 23 = 987 + 023 = 1010
  • 同時に、すべてのコンピューティングは、キャリーの問題を検討する必要がありますが、また、キャリー・ビット・コンピューティングの終了後に現在の値を更新する必要があります
  • トラバーサルの二つのリストがすべて完了している場合は、キャリー値は、新しいリストで最前線にノードを追加するには、1である1
  • ヒント:リストの問題については、最初のノードの結果を返す、一般的に所定のポインタプレを初期化する必要があり、このポインタは、場合利用可能なノード値プレポインタ・オブジェクトのリストの初期化を使用して、実際のヘッダノードヘッドを指し示すノードであり、そして、リスト構築プロセスが結果を返すことができない、ヘッドポインタの損失につながるので、ポインタを移動する必要があり、

私たち以下はプロセス上の1例:

(1)事前に0に初期化ポインタを初期化し、そのためヘッドノードへCUR点は、ヘッドを指し、キャリー及びキャリー

(2)上記のアイデアを使用して丸め、10、搬送及び余りを取る+ l2.value + l1.value

(3)7 + 3 = 10を使用して、= 1、和= 0、及び翻訳ノードL1、L2、CURを運びます

(4)l1.value + l2.value +キャリー= 11の後、キャリー=和/ 10 = 1、ビット値1を加算%10 = 1の残差値に

(5)計算した後、我々はL1、L2、CURを翻訳し始めます

(6)l1.value + l2.value +キャリー= 11の後、キャリー=和/ 10 = 1、ビット値1を加算%10 = 0の残差値に(実際のリストが格納されています)

(7)が算出される並進L1、L2、CUR後、0のビットの数ではありません

(8)リンクされたリスト・トラバーサルの端部は、キャリーは、ノードが追加され、1であり、ヘッドノードが除去されます

(9)すなわち、結果が0101であるヘッドノード0を除去した後、1010を反転さ要件を満たすために。

以下のコード全体:

public class ListNode {
      int val;
      ListNode next;
      ListNode(int x) { val = x; }
 }

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode pre = new ListNode(0);
        ListNode cur = pre;
        int carry = 0;
        while(l1 != null || l2 != null) {
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;
            int sum = x + y + carry;
            
            carry = sum / 10;
            sum = sum % 10;
            cur.next = new ListNode(sum);

            cur = cur.next;
            if(l1 != null)
                l1 = l1.next;
            if(l2 != null)
                l2 = l2.next;
        }
        if(carry == 1) {
            cur.next = new ListNode(carry);
        }
        return pre.next;
    }
}

 

解法二

抛弃解法一的思想:

  • 新建节点的class,包括该节点的值以及指向下一个节点的指针
  • 新建链表result,用于输出结果
  • 此不需要进位值标志carry,而是如果total > 10,让l1.value加1(或者l2.value加1),然后循环遍历即可

首先我们新建节点的class,如下:

public class ListNode {
    public var val: Int
    public var next: ListNode?
    public init(_ val: Int) {
        self.val = val
        self.next = nil
    }
}

下面是核心代码,已在leetcode上成功运行.

func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
    var result: ListNode? = nil
    if l1 == nil && l2 == nil {
        return result
    }
    
    var s1 = l1
    var s2 = l2
    var total = (s1?.val ?? 0) + (s2?.val ?? 0)
    if total < 10 {
        s1 = s1?.next
    } else {
        total = total % 10
        s1 = s1?.next ?? ListNode.init(0)
        s1!.val = s1!.val + 1
    }
    
    result = ListNode.init(total)
    s2 = s2?.next
    result!.next = addTwoNumbers(s1, s2)
    return result
}

 

以上就是别致的两数之和,关于自己解决此类方法的思想和代码,希望对大家有所帮助!!!

おすすめ

転載: www.cnblogs.com/guohai-stronger/p/11715023.html