兩數相加
給出兩個 非空 的鏈表用來表示兩個非負的整數。
其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 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 }
