2022-10-25 16:46阅读: 22评论: 0推荐: 0

力扣-2-两数相加

这里麻烦的在于两个情况

  1. 需要考虑进位的问题
  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 中国大陆许可协议进行许可。

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