力扣-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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步