题目描述
给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7
问题
之前的思路是不停的翻转链表,但是看到了题目中的进阶话题。我就想着用数组的形式保存数据,并逆序相加,考虑到链表长度相等,链表头部进位的可能,就想着多设置一个结点,放置进位信息。编译的时候是挺成功的。但是提交代码的时候,有一个我一直没能解决的问题:
执行出错信息:
AddressSanitizer: stack-use-after-scope on address 0x7fff86664300 at pc 0x000000427265 bp 0x7fff866632c0 sp 0x7fff866632b8
最后执行的输入:
[5]
[5]
菜鸟第一次尝试在网上请教大家,还望各位能帮我解答一下困惑。下面是我的代码,写的比较繁琐,望各位耐心观看。谢谢!
代码部分
/**
* 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) {
//if(l1 == NULL || l2 == NULL)
// return NULL;
vector<int> ll1, ll2;
ListNode* cur1 = l1, *cur2 = l2;
while(cur1 != NULL){
ll1.push_back(cur1->val);
cur1 = cur1->next;
}
while(cur2 != NULL){
ll2.push_back(cur2->val);
cur2 = cur2->next;
}
int i = ll1.size()-1, j = ll2.size()-1;
int flag = 0;
if(ll1.size() >= ll2.size()){
while(i >= 0 && j >= 0){
ll1[i] = ll1[i] + ll2[j] + flag;
flag = ll1[i] / 10;
ll1[i] = ll1[i] % 10;
i--;
j--;
}
if(i > 0)
ll1[i-1] = ll1[i-1] + flag;
ListNode* cur11 = l1;
for(int k = 0; k <= ll1.size() - 1; k++){
cur11->val = ll1[k];
cur11 = cur11->next;
}
if (flag != 0){
ListNode L(0);
ListNode* l = &L;
l->val = flag;
l->next = l1;
l1 = l;
return l1;
}
else
return l1;
}
else{
while(i >= 0 && j >= 0){
ll2[j] = ll1[i] + ll2[j] + flag;
flag = ll2[j] / 10;
ll2[j] = ll2[j] % 10;
i--;
j--;
}
if(j > 0)
ll2[j-1] = ll2[j-1] + flag;
ListNode* cur22 = l2;
for(int k = 0; k <= ll2.size() - 1; k++){
cur22->val = ll2[k];
cur22 = cur22->next;
}
if (flag != 0){
ListNode L(0);
ListNode* l = &L;
l->val = flag;
l->next = l2;
l2 = l;
return l2;
}
else
return l2;
}
}
};