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言語の文法に基づいてされていません。今月は、基礎を強化し、質問を磨くようにしてください。