力扣-2-两数之和
承接做过的上一题——合并两个有序数组的思路,代码思路大概分本两步:
- 对两个数组按位相加
- 对每一位上大于10的数字进位操作
代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(l1==nullptr){
return l2;
}else if(l2==nullptr){
return l1;
}
ListNode* head = new ListNode(0);
head->val = l1->val+l2->val;
head->next = addTwoNumbers(l1->next,l2->next);
if(head->val>=10){
if(head->next==nullptr){
ListNode* node = new ListNode(0);
head->next = node;
node->val=1;
}else{
head->next->val+=1;// 问题在这里,这个后进位操作不保证加一后<10
}
head->val%=10;
}
return head;
}
};
但这是有问题的,具体体现在例如:
[9 9 9]
[9]
这个测试用例的预期结果是[8 0 0 1]
,但上述代码的结果会是[8 10 9]
问题在head->next->val+=1;
这个加一操作,如果下一层迭代中两个存在一个空指针返回了,那么当前节点就不会有进位操作
问题的关键在于如何处理这个进位操作
想了很久,我觉得以我的思路我好像没法解决这个问题
瞄了一眼官方题解中有一句“如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个0”,其实我遇到的问题就可以说是数组长度不同引起的,那么,这会不会是一个突破口?
如何做到当面提到这一点呢
好吧我也不知道如何做到
哈哈哈哈哈哈,不就是缺一层进位操作吗,反正我的进位操作也几乎是独立的,干脆就把进位操作也单独封装成一个方法进行递归了,而且居然也没超时😂甚至看起来还不错
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(l1==nullptr){
return l2;
}else if(l2==nullptr){
return l1;
}
ListNode* head = new ListNode(0);
head->val = l1->val+l2->val;
head->next = addTwoNumbers(l1->next,l2->next);
carry(head);
return head;
}
void carry(ListNode* head){
if(head->val>=10){
head->val%=10;
if(head->next==nullptr){
ListNode* node = new ListNode(1);
head->next = node;
}else{
head->next->val+=1;
carry(head->next);
}
}
}
};
后记
啊对了,这题过程中出现了类似
runtime error: member access within misaligned address 0x7f621ba06de2 for type 'struct ListNode', which requires 8 byte alignment (ListNode.c)
0x7f621ba06de2: note: pointer points here
这样的报错
当我只简单地声明了ListNode* node;
并在后续直接使用它的时候,后才改成了ListNode* node = new ListNode(1);
报错才得以消除
其实为什么会这样,我还是不甚了解。