十日をパンチ:2つの数値を一緒に


I、題し


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

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

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

例:

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

出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/add-two-numbers
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。


第二に、コードの実装


アイデア:キャリーを追跡するための変数を使用し、少しずつ添加し、最下位ビットのヘッダ開始シミュレーションからなる群から

コード:

/**
 * 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 dummyHead = new ListNode(0);   //设置哑结点
    ListNode p = l1, q = l2, curr = dummyHead;
    int carry = 0;   //初始化进位值
    while (p != null || q != null) {
        int x = (p != null) ? p.val : 0;   //如果p未达到末尾,将p的值赋给x;否则把0赋给x
        int y = (q != null) ? q.val : 0;   //如果q未达到末尾,将q的值赋给y;否则将0赋给y
        int sum = carry + x + y;
        carry = sum / 10;   // 更新carry的值
        curr.next = new ListNode(sum % 10);   //更新当前结点的值
        curr = curr.next;
        if (p != null) p = p.next;
        if (q != null) q = q.next;
    }
    if (carry > 0) {
        curr.next = new ListNode(1);
    }
    return dummyHead.next;
    }
}

結果:
ここに画像を挿入説明
時間計算:O(MAX(M、N ))、 mは、nは長さL1及びL2れる
空間の複雑さ:O(MAX(M、N ))、 最もmaxにおける新しいリストの長さ( M、N)+1


第三に、収穫


:以下に特に注意を払う必要があると
長く、他のリストよりも(1)リスト
(2)リストが空で、空のリストが表示されます
(3)が発生し、追加の最終合計を運びます

第二に、プログラミングプロセスでは、私は特別な代入文の開発した
int型のx =(!P = nullの
)P.val:0;? pの値が空でない場合ということを意味し、[割り当てのx p.val 、その後、X 0に反します

公開された10元の記事 ウォンの賞賛0 ビュー121

おすすめ

転載: blog.csdn.net/qq_45400247/article/details/104783485