給出兩個 非空 的鏈表用來表示兩個非負的整數(shù)。其中,它們各自的位數(shù)是按照 逆序 的方式存儲的,并且它們的每個節(jié)點只能存儲 一位 數(shù)字。
如果,我們將這兩個數(shù)相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設(shè)除了數(shù)字 0 之外,這兩個數(shù)都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:我的方法額外開辟了內(nèi)存空間,定義了一個數(shù)組,將兩個鏈表中的數(shù)先相加然后存放到數(shù)組中,然后從頭遍歷一邊數(shù)組,把需要進位的位置進行進位計算,然后最后在轉(zhuǎn)到一個鏈表中去
注意:1:一開始存入數(shù)組時注意哪個鏈表長,哪個鏈表短
2:最后數(shù)組轉(zhuǎn)鏈表的時候,很可能在最后會有進位,超出了數(shù)組的下標(biāo)范圍,要注意考慮
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
vector<int> v;
while(l1 && l2){
v.push_back(l1->val + l2->val);
l1 = l1 -> next;
l2 = l2 -> next;
}
while(l1){
v.push_back(l1 -> val);
l1 = l1 -> next;
}
while(l2){
v.push_back(l2 -> val);
l2 = l2 -> next;
}
for(int i = 0 ; i < v.size()-1 ; i ++){
if(v[i] != 0){
v[i+1] += v[i]/10;
v[i] %= 10;
}
}
if(v[v.size()-1] >= 10){
v.push_back(v[v.size()-1]/10);
v[v.size() - 2] %= 10;
}
ListNode* head = new ListNode(0);
ListNode* p = head;
p -> val = v[0];
for(int i = 1 ; i < v.size() ; i++){
ListNode* node = new ListNode(v[i]);
p -> next = node;
p = p -> next;
}
return head;
}
};