力扣-2-两数相加
这里麻烦的在于两个情况
- 需要考虑进位的问题
- 每位数字是链表形式存储的,而且是逆序,这对想要从地位向高位相加,以及进位带来了麻烦
最直接的做法是把各位数字取出来处理后再构造一个新链表,但这肯定不是题目期望的
那么考虑在一条链表上原地操作
逆向的好处是已经从低位对齐了
那么我需不需要知道“哪一条链表更长呢?”是否是必要的?如果在其中一条链表上原地操作的话,就需要知道哪条链表更长
瞄一眼题解确实是构造了一条新的链表,它修改了原指针,并且创建了两个新指针
head指针用于保存新的头节点,因为生成的链表是逆序的,所以需要
cur指针用于生成遍历,用于确定新建的节点的插入位置
而至于两条链表不一样长的问题,对于短链表一定会出现空指针的情况
这里的处理方式是,首先把空指针的val看作是0
另外遇到空指针,指针就不再向下移动,避免发生空指针异常
另外这里的进位,稍加思考就可以确定进位不会超过1,所以这里直接用一个bool值来表示是否进位
但其实没必要bool,让进位也是int参与计算写出来会更简洁,然后也可以当bool用
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { int flag=0; ListNode* ptr1 = l1, * ptr2 = l2;// 这里我还是打算不修改原指针 ListNode* head =nullptr, *cur = nullptr; while (ptr1 || ptr2) { // 注意这里的写法很有意思 int val1 = ptr1 ? ptr1->val : 0; int val2 = ptr2 ? ptr2->val : 0; int sum = val1 + val2 + flag; flag = sum / 10;// 更新进位 if (flag) sum %= 10;// 如果有进位就更新sum // 开始追加新节点 if (!head) // 第一次初始化 head = cur = new ListNode(sum); else { cur->next = new ListNode(sum); cur = cur->next; } // 更新两个链表的遍历指针 if (ptr1) ptr1 = ptr1->next; if (ptr2) ptr2 = ptr2->next; } // 最后一步是,如果较长的链表遍历完了,还有一个进位 if (flag) cur->next = new ListNode(flag); return head; }
2023/2/23
这是bool版本,确实是int版本看起来更简洁
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* ptr1 = l1, * ptr2 = l2, * cur = nullptr, * head = nullptr; bool flag = false;// 进位标志 while (ptr1 || ptr2) { // 只有当两个都是空节点时才不继续执行 // 所以说指针可能有一个是空指针的情况 int num1 = ptr1 ? ptr1->val : 0; int num2 = ptr2 ? ptr2->val : 0; int sum = flag ? num1 + num2 + 1 : num1 + num2; if (sum / 10) { flag = true; sum %= 10; } else flag = false; ListNode* node = new ListNode(sum); if (!head) { head = node; cur = head; } else { cur->next = node; cur = cur->next; } ptr1 = ptr1 ? ptr1->next : nullptr; ptr2 = ptr2 ? ptr2->next : nullptr; } // 最后可能还有一个进位没有处理 if (flag) cur->next = new ListNode(1); return head; }
本文作者:YaosGHC
本文链接:https://www.cnblogs.com/yaocy/p/16825181.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步