2022-04-25 23:35阅读: 53评论: 0推荐: 0

力扣-2-两数之和

承接做过的上一题——合并两个有序数组的思路,代码思路大概分本两步:

  1. 对两个数组按位相加
  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);报错才得以消除
其实为什么会这样,我还是不甚了解。

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16192515.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(53)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起