2つの数値をLeetCode_2_Add

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

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

アルゴリズム:最初から最後まで2つのトラバースリスト、キャリーとの和を法の現在のノードのポインタと番号の意味の範囲内の数字を与えます。バイナリ変数キャリー、キャリーフラグを定義します。最後に、あなたはリターンのリストを生成することができます。

ListNode *head=NULL,*p=NULL;
        int carry=0;
        while(l1||l2){
            int sum1=l1?l1->val:0;
            int sum2=l2?l2->val:0;
            int sum=sum1+sum2+carry;
            carry=sum/10;
            ListNode *cur=new ListNode(sum%10);
            if(!head)
                head=cur;
            if(p)
                p->next=cur;
            p=cur;
            l1=l1?l1->next:NULL;
            l2=l2?l2->next:NULL;
        }
        if(carry){
            ListNode *l=new ListNode(carry);
            p->next=l;
        }
        return head;

以下は、実行時の効率チャートにある
ランタイムチャート
道を:長い時間が道少しさび、アルゴリズムのトピックのリストを書いていません。以下、単にプログラムセグメントでの小さなバグを書き始めています

ListNode *l3,*p;
        ListNode *head=new ListNode(0); 
        p=l3=head;
        int carry=0;
        while((l1!=NULL)&&(l2!=NULL)){
            int sum=0;
            sum=l1->val+l2->val+carry;
            carry=sum/10;
            sum%=10;
            ListNode* tempNode=new ListNode(sum);
            l3->next=tempNode;
            l3=l3->next;
            l1=l1->next;
            l2=l2->next;
        }
        while(l1!=NULL){
            ListNode* tempNode=new ListNode(l1->val);
            l3->next=tempNode;
            l1=l1->next;
            l3=l3->next;
        }
        while(l2!=NULL){
            ListNode* tempNode=new ListNode(l2->val);
            l3->next=tempNode;
            l2=l2->next;
            l3=l3->next;
        }
        if(carry!=0){
            ListNode* tempNode=new ListNode(carry);
            l3->next=tempNode;
            l3=l3->next;
        }
        head=head->next;
        delete p;
        return head;

:インターネットプログラミングの偉大な神
アルゴリズムイデオロギー:リストL1の結果、L1は、このリストの最後のリターンです。データL2 L1を順次対応するノードに適用され、L1-> valの値> = 10の場合に加え、次いで、キャリー、もしL1->次NULL、ストレージノードは、キャリー結果を適用する必要があり、次のビットを入力しないであろう空気がヴァルに添加されます。場合には、L1NULL L1ができ、L2は、残りのノードに接続する必要がある場合。
この方法は多くの時間を節約するだけでなく、多くのスペースを節約できます(役に立たないノードのために適用する必要はありません)

class Solution {
public:
  ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    auto l3=l1;
    while(1) {
      if (l1==NULL) {
        return l3;
      }
      if(l2!=NULL) {
        l1->val+=l2->val;
        l2=l2->next;
      }
      if (l1->val>=10) {
        l1->val-=10;
        if (l1->next==NULL) {
          l1->next = new ListNode(1);
        }else {
          l1->next->val++;
        }
      }
      if (l1->next==NULL&&l2!=NULL) {
        l1->next=l2;
        l2=NULL;
      }
      l1=l1->next;
    }
  }
};

実行時間は次のとおりです。
ここに画像を挿入説明

おすすめ

転載: blog.csdn.net/all_about_WZY/article/details/88243039