两数相加c语言实现
給定兩個(gè)非空鏈表來(lái)表示兩個(gè)非負(fù)整數(shù)。位數(shù)按照逆序方式存儲(chǔ),它們的每個(gè)節(jié)點(diǎn)只存儲(chǔ)單個(gè)數(shù)字。將兩數(shù)相加返回一個(gè)新的鏈表。
你可以假設(shè)除了數(shù)字 0 之外,這兩個(gè)數(shù)字都不會(huì)以零開(kāi)頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 原因:342 + 465 = 807 解題思路:我先開(kāi)始的思路是,再創(chuàng)建一個(gè)返回鏈表,然后將兩個(gè)數(shù)的和放到返回鏈表中返回,具體處理的時(shí)候,先檢查每一位相加時(shí)前面是不是有進(jìn)位,如果有進(jìn)位,則在相加的時(shí)候加上進(jìn)位的值,在計(jì)算出每一位的和之后,如果和的值小于10,則沒(méi)有進(jìn)位,進(jìn)位標(biāo)志位false,進(jìn)位值不做修改,如果有進(jìn)位,則進(jìn)位標(biāo)志位true,進(jìn)位值做相應(yīng)的修改。然后我的初始代碼如下: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {bool Carry=false;int Carry_Val=0;int temp; struct ListNode *p1,*p2,*Ret_List;p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;Ret_List=p1;p2=p1;while(l1&&l2){if(Carry){temp=Carry_Val+l1->val+l2->val;if(temp<10){Carry=false;p2->val=temp;}else{Carry=true;p2->val=temp-10;;Carry_Val=temp/10;}}else{temp=l1->val+l2->val;if(temp<10){Carry=false;p2->val=temp;}else{Carry=true;p2->val=temp-10;Carry_Val=temp/10;}}l1=l1->next;l2=l2->next;if(l1||l2){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;}}while(l1){if(Carry){temp=Carry_Val+l1->val;if(temp<10){Carry=false;p2->val=temp;}else{Carry=true;p2->val=temp-10;Carry_Val=temp/10;}}else{temp=l1->val;if(temp<10){Carry=false;p2->val=temp;}else{Carry=true;p2->val=temp-10;Carry_Val=temp/10;}}l1=l1->next;if(l1){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;}}while(l2){if(Carry){temp=Carry_Val+l2->val;if(temp<10){Carry=false;p2->val=temp;}else{Carry=true;p2->val=temp-10;Carry_Val=temp/10;}}else{temp=l2->val;if(temp<10){Carry=false;p2->val=temp;}else{Carry=true;p2->val=temp-10;Carry_Val=temp/10;}}l2=l2->next;if(l2){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;}}if(Carry){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;p2->val=Carry_Val;}return Ret_List;}這明顯太長(zhǎng)太長(zhǎng)了,中間有非常多的重復(fù)代碼。然后我發(fā)現(xiàn),我在計(jì)算Carry_Val(即進(jìn)位值)的值得時(shí)候,要判斷是不是有進(jìn)位,但是我發(fā)現(xiàn),當(dāng)有進(jìn)位的時(shí)候temp/10,能計(jì)算出進(jìn)位的值,但是,當(dāng)沒(méi)有進(jìn)位的時(shí)候,temp/10的值為0。這就為我提供了一個(gè)新的解題方法。代碼如下: struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {int Carry_Val=0;int temp; struct ListNode *p1,*p2,*Ret_List;p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;Ret_List=p1;p2=p1;while(l1&&l2){temp=l1->val+l2->val+Carry_Val;p2->val=temp%10;Carry_Val=temp/10;l1=l1->next;l2=l2->next;if(l1||l2){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;}}while(l1){temp=l1->val+Carry_Val;p2->val=temp%10;Carry_Val=temp/10;l1=l1->next;if(l1){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;}}while(l2){temp=l2->val+Carry_Val;p2->val=temp%10;Carry_Val=temp/10;l2=l2->next;if(l2){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;}}if(Carry_Val){p1=(struct ListNode*)malloc(sizeof(struct ListNode));p1->next=NULL;p2->next=p1;p2=p1;p2->val=Carry_Val;}return Ret_List;}可以看出,代碼量有了極大的簡(jiǎn)化。但是還有很多重復(fù)代碼,于是我就又進(jìn)行了改進(jìn),代碼如下: struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { int Carry_Val=0; int temp; struct ListNode *p1,*p2,*Ret_List; Ret_List=l1; while(l1&&l2){ temp=l1->val+l2->val+Carry_Val; l1->val=temp%10; Carry_Val=temp/10; p2=l1;l1=l1->next; l2=l2->next; } if(!l1){p2->next=l2;l1=p2->next;}while(l1){ temp=l1->val+Carry_Val; l1->val=temp%10; Carry_Val=temp/10;p2=l1;l1=l1->next; } if(Carry_Val){ p1=(struct ListNode*)malloc(sizeof(struct ListNode)); p1->next=NULL; p1->val=Carry_Val; p2->next=p1;} return Ret_List; } 這就很nice了,空間復(fù)雜度也極大的降低了。 歡迎留言評(píng)論交流。總結(jié)
- 上一篇: 支付牌照多少钱啊?
- 下一篇: 检查不孕不育去新乡哪家医院好