力扣-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);报错才得以消除
其实为什么会这样,我还是不甚了解。

posted @ 2022-04-25 23:35  YaosGHC  阅读(64)  评论(0)    收藏  举报