給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。 您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。 示例: 輸入:(2 -> 4 -> ...
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
程式代碼如下:
#include <iostream> #include <cstdio> using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* addTwoNumbers(ListNode* l1, ListNode* l2); int main() { int m,n; cin>>m>>n; int temp_m; cin>>temp_m; ListNode *head_m = new ListNode(temp_m); ListNode *index = head_m; for(int i = 0;i<m-1;++i) { cin>>temp_m; ListNode *new_m_node = new ListNode(temp_m); index->next = new_m_node; index = new_m_node; } int temp_n; cin>>temp_n; ListNode*head_n = new ListNode(temp_n); index = head_n; for(int i = 0;i<n-1;++i) { cin>>temp_n; ListNode *new_n_node = new ListNode(temp_n); index->next = new_n_node; index = new_n_node; } ListNode *ans = addTwoNumbers(head_m, head_n); while (ans->next!=NULL) { cout<<ans->val<<endl; ans = ans->next; } cout<<ans->val; return 0; } ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { bool flag = true; ListNode *ans = NULL; ListNode *ans_head = NULL; bool ifadd = false; while (l1!=NULL&&l2!=NULL) { if(!ifadd) { if(flag) { flag = false; ans = new ListNode((l1->val+l2->val)%10); ans_head = ans; } else { ans->next = new ListNode((l1->val+l2->val)%10); ans = ans->next; } if((l1->val+l2->val)/10==1) ifadd = true; l1 = l1->next; l2 = l2->next; } else { if(flag) { flag = false; ans = new ListNode((l1->val+l2->val+1)%10); ans_head = ans; } else { ans->next = new ListNode((l1->val+l2->val+1)%10); ans = ans->next; } if((l1->val+l2->val+1)/10==0) ifadd = false; l1 = l1->next; l2 = l2->next; } } if(l1==NULL&&l2==NULL) { if (ifadd) { ans->next = new ListNode(1); } else { return ans_head; } } if(l1==NULL&&l2!=NULL) { l1 = l2; } while (l1!=NULL) { if(!ifadd) { if(flag) { flag = false; ans = ans_head = ans; } else { ans->next = new ListNode((l1->val)%10); ans = ans->next; } if((l1->val)/10==1) ifadd = true; l1 = l1->next; } else { if(flag) { flag = false; ans = new ListNode((l1->val+1)%10); ans_head = ans; } else { ans->next = new ListNode((l1->val+1)%10); ans = ans->next; } if((l1->val+1)/10==0) ifadd = false; l1 = l1->next; } } if (ifadd) { ans->next = new ListNode(1); } else { return ans_head; } return ans_head; }
在該題目中,我總共犯了兩個錯誤:
1.在對指針賦值時,將空指針賦值給要創建對象的指針,導致新實例化的對象,並沒有進入到鏈表當中。
2.忘記處理最後的進位
如若該題目改成鏈表的存儲方式為由高位到低位存儲,則還需要再建立一個反向的單鏈表由低位到高位存儲答案,以便於發生多次進位的時候逐級向高位進位。