【ブラシノート】LeetCode_02:両数加算_中等(C)

11379 ワード



  • テーマ:2つの数を足す
    2つの非負の整数を表すために、2つの非空のチェーンテーブルが与えられる.ここで、それぞれのビット数は逆順序で格納され、各ノードには1桁の数字しか格納されません.この2つの数を加算すると、新しいチェーンテーブルが返され、合計が表示されます.数値0以外の2つの数は0で始まると仮定できます.例:入力:(2->4->3)+(5->6->4)出力:7->0->8理由:342+465=807
    初めてLeetCodeを使って、メモを書いてからハハハハを見ます.この問題は基本的な考え方が簡単だと感じて、新しいノードを作ってチェーンテーブルを構築しますが、細部には穴がたくさんあります(もちろん主な原因は私が本当に料理が多すぎるからです).
  • その桁数は逆シーケンスで、結果も逆シーケンスで、最初は正常な順序で加算されました.つまり、「2+5」、「4+6」というように、配列に格納されます.チェーンテーブルを構築する際に逆順に配列を巡る(本当にバカだ、これで正順出力になったからだ)が、ビット数の違いは考えていないし、不思議なことに例「0」で実行した結果、死活は1??なぜか分からない.最後に入力逆順出力も逆順、すなわち「2」と「5」であることに気づいたいずれも桁数で、直接加算してチェーンテーブルを構築すればいいです.出力も「7」が1位だからです.
  • ある位置の数字の加算が10以上であれば、次のキャリーが必要です.次のサイクルの時に加算されるはずです.これは最初はコントロールできず、無駄なコードをたくさん書きました.その後、大神のコードを見ると、簡単なことがわかりました.まずこのラウンドのsumを計算し、それから進位の変数を制御すればいいのですが、各ラウンドのループは進位変数をリフレッシュしなければなりません.
  • チェーンテーブルを構築する方法:テールプラグ法、簡潔です.大神さんはすごいですね.
  • チェーンテーブルが先に終わったら、終わっていない長いチェーンテーブルを直接つなぎます.すなわち、p 1が先に終了すると、p 1=p 2となり、p 1を巡回し、すなわち、未終了のp 2を巡回する.p 2が先に終わるとp 1=p 1となる.
  • 桁が多いと、複数桁のsumが10以上になる可能性がありますが、実際にはgo(進位)変数を1ラウンドごとにリフレッシュし、このラウンドのsumを事前に:p 1->val+p 2->val+goで計算すればOKです.
  • から最後の非空チェーンテーブルが終了すると、キャリーがある可能性があります.つまり、この例の場合:9342+665=10007で、2439と566が入力され、最後にキャリーがある場合は、goが1であるかどうかをループ終了して判断し、新しいノードを作成すると、valが1になり、その後、テール挿入法になります.
  • 最后に最后にすべてが终わる尾针のnextは必ず空にします!ぜひtail->next=NULL!!構造にはListNode*にnextのポインタが定義されているので、tailのnextが値を付けないとエラーが報告され、コンピュータはnextがどこを指しているのか分からない!!そして!!!仮初めの结点は釈放します!!
  • /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    
    struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    
        struct ListNode *tail;
        struct ListNode *head;
        struct ListNode *temp;
        struct ListNode *p1;
        struct ListNode *p2;
        int sum = 0;
    	int go = 0;//       
    
       	head = (struct ListNode*)malloc(sizeof(struct ListNode));
        head->next = NULL;
        tail = head;//       
        
        p1 = l1;
        p2 = l2;
    
        while(p1 && p2)
        {
            sum = p1->val + p2->val + go;
            if(sum >=10)
            {
            	sum = sum % 10;
            	go = 1;
    		}
    		else go = 0;
    		
    		//    
    		tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
    		tail = tail->next;
    		tail->val = sum;
            
            p1 = p1->next;
            p2 = p2->next;
        }
        if(p1 == NULL) //l2      
        {
        	p1 = p2;		
    	}
       	else
       	{
       		p1 = p1;
    	}
       	while(p1)
       	{
       		sum = p1->val + go;
       		if(sum >= 10)
       		{
       			sum = sum % 10;
       			go = 1;
    		}
    		else go = 0;
    		
    		tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
    		tail = tail->next;
    		tail->val = sum;
    		
    		p1 = p1->next;
    	}
    	
    	if(go == 1)
    	{
    		tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
    		tail = tail->next;
    		tail->val = 1;
    	}
    	
    	tail->next = NULL;//tail next   !! 
    	
    	temp = head;
    	head = head->next;
    	free(temp);
    
    return head;
    }