兩數相加(C語言)


兩數相加

給出兩個 非空 的鏈表用來表示兩個非負的整數。

其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。

如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

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

分析:首先,既然是兩個非空鏈表,那么就不用考慮鏈表為空的情況了;

         這道題我原本想先把兩個整數相加,然后把相加后的和的位數按照逆序用鏈表存儲一下,但是這樣會有一個問題,如果鏈表特別長的話,整數就會特別大,就會溢出,顯然這樣做是行不通的。

         因為兩個整數的位數是按照逆序的方式存儲的,那么每個鏈表的第一個元素都是個位,那么依次遍歷兩個鏈表從個位開始相加就可以,同時用 signal 來記錄是否需要進位,若需要進位就把 signal 設置為1,計算更高一位的時候把 signal 的值也加上即可。

        下邊是代碼實現:

  1 /**
  2  * Definition for singly-linked list.
  3  * struct ListNode {
  4  *     int val;
  5  *     struct ListNode *next;
  6  * };
  7  */
  8 
  9 
 10 struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
 11     struct ListNode*list1 = l1;
 12     struct ListNode*list2 = l2;
 13     int signal = 0;
 14     struct ListNode *list = (struct ListNode *)malloc(sizeof(struct ListNode));
 15     list->next = NULL;
 16     if(list1->val+list2->val+signal>=10){
 17         list->val = list1->val+list2->val+signal-10;
 18         signal=1;
 19     }else{
 20         list->val = list1->val+list2->val+signal;
 21         signal=0;
 22         
 23     }
 24     struct ListNode *temp = list;
 25     list1=list1->next;
 26     list2=list2->next;
 27     while(list1!=NULL&&list2!=NULL){
 28         struct ListNode *body = (struct ListNode *)malloc(sizeof(struct ListNode));
 29         body->next=NULL;
 30         printf("!!!!!!%d",signal);
 31         if(list1->val+list2->val+signal>=10){
 32             body->val=list1->val+list2->val+signal-10;
 33             signal=1;
 34         }else{
 35             body->val=list1->val+list2->val+signal;
 36             signal=0;
 37         }
 38         list1 = list1->next;
 39         list2 = list2->next;
 40         temp->next = body;
 41         temp = temp->next;
 42         
 43     }
 44     if(list1==NULL&&list2==NULL){
 45         if(signal==0){
 46             return list;
 47         }else{
 48             struct ListNode *body = (struct ListNode *)malloc(sizeof(struct ListNode));
 49             body->next=NULL;
 50             body->val=1;
 51             temp->next = body;
 52             temp=temp->next;
 53             return list;
 54         }
 55     }
 56     
 57     if(list1!=NULL){
 58         if(signal==0){
 59             temp->next=list1;
 60             return list;
 61         }else{
 62             while(list1!=NULL){
 63                 if(signal==0){
 64                     temp->next=list1;
 65                     return list;
 66                 }else{
 67                     struct ListNode *body = (struct ListNode *)malloc(sizeof(struct ListNode));
 68                     body->next=NULL;  
 69                     if(list1->val+signal>=10){
 70                         body->val=0;
 71                         signal=1;
 72                     }else{
 73                         body->val=list1->val+signal;
 74                         signal=0;
 75                     }
 76                     temp->next=body;
 77                     temp=temp->next;
 78                 }
 79                 list1 = list1->next;
 80             }
 81         }
 82     }
 83     
 84     if(list2!=NULL){
 85         if(signal==0){
 86             temp->next=list2;
 87             return list;
 88         }else{
 89             while(list2!=NULL){
 90                 if(signal==0){
 91                     temp->next=list2;
 92                     return list;
 93                 }else{
 94                     struct ListNode *body = (struct ListNode*)malloc(sizeof(struct ListNode));
 95                     body->next=NULL;
 96                     if(list2->val+signal>=10){
 97                         body->val=0;
 98                         signal=1;
 99                     }else{
100                         body->val=list2->val+signal;
101                         signal=0;
102                     }
103                     temp->next=body;
104                     temp=temp->next;
105                 }
106                 list2 = list2->next; 
107             }
108         }
109     }
110     if(signal==0){
111         return list;
112     }else{
113         struct ListNode *body = (struct ListNode *)malloc(sizeof(struct ListNode));
114         body->next=NULL;
115         body->val = signal;
116         temp->next=body;
117         return list;
118     }
119     
120     return list;
121 }

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM