leetcodeアルゴリズム練習問題 - 2つの数値(C言語)

leetcode算術演習 - 2つの数値

最近の再審査を準備し、これだけでは、この質問に、C言語の学習を再起動するには、私は多くの知識を覚えています。レビューを容易にするため、記録したい、私はそう。
繰り返し質問した後ブラシ場合は、より良い解決策はいっぱいになります。

次のように1つの質問

次の2つの非負表す2つの非空のリンクリスト与えられている
整数を。数字は逆の順序で格納されており、それらの各
ノードは、単一の数字を含みます。2つの数値を追加してそれを返す
リンクリスト。次の2つの数字が数0自体を除き、任意の先行ゼロを含まない仮定することができます。
例:
入力:(2 - > 4 - > 3)+(5 - > 6 - > 4)
出力:7 - > 0 - > 8
説明:342 + 465 = 807。

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

2アルゴリズムのアイデア

この問題は、直接L1二つのリストへの2つのポインタのP、Qのポインティングを定義、L2、次いでpについて、後方横断Qが、各時間意志トラバースP-> VALおよびQ-> valを加え、結果が10より大きい場合、我々は実行する必要があります。私たちは、キャリーが整数変数で表される運びます。加算の結果は、新しいリストに格納されています。
ここに画像を挿入説明
この質問は3つの特別なケースを検討する必要があります。

テストケース 説明
L1 = [0,1]、L2 = [0,1,2] ときに別のリストより長いリスト
L1 = []、L2 = [0,1] リストが空の場合、空のリストが表示されます
L1 = [9,9]、L2 = [1] 最後に、可能な追加の加算キャリー、忘れることは非常に簡単です。

コードは以下の通りであります:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode*head = (struct ListNode*)malloc(sizeof(struct ListNode));  //定义一个带有头结点的结构体指针变量,为其开辟空间。
    head->next = NULL;  //这一句必不可少,否则将会出现错误。
    int carry =0,sum,t1,t2;    //carry初始化为0表示无进位。
    struct ListNode *p=l1,*q=l2,*l0=head;
    while(p!=NULL || q!=NULL){  
        struct ListNode*p1 = (struct ListNode*)malloc(sizeof(struct ListNode));
        p1->next = NULL;
        if(p==NULL)  //这里的意思是若p为null,而q不为null时,直接将其值设为0,对sum的值就不会有影响。
            t1=0;
        else{
            t1=p->val;
            p = p->next;
        }
        if(q==NULL)
            t2=0;
        else{
            t2=q->val;
            q = q->next;
        }
        sum=t1 + t2 + carry;
        l0 ->next = p1; // 将新开辟的p1插入到l0的后面。
        p1->val = sum % 10;
        if(sum>=10)
            carry=1;  //如果大于10就要进位。
        else
            carry=0;
        l0 = l0->next;       
    }
    //下面这个判断语句不可缺少,假设l1:[5]  l2 :[5]
    //那么5+5=10要进位,而此时若少这一句,则答案会只有0。因为已经跳出了上面的while循环。
    if(carry==1){
        struct ListNode*p1 = (struct ListNode*)malloc(sizeof(struct ListNode));
        p1->next = NULL;
        l0->next = p1;
        p1->val = 1;
    }
    return head->next;        
            
}

3時間の複雑さと空間の複雑

ここに画像を挿入説明

4まとめ

結果は非常に満足のいくものではないことができますが、まだ良いが。
時間の感覚がアルゴリズムに費やしたが、C言語の文法に基づいてされていません。今月は、基礎を強化し、質問を磨くようにしてください。

リリース6元記事 ウォンの賞賛0 ビュー140

おすすめ

転載: blog.csdn.net/weixin_38072112/article/details/103937023