leetcode 第二题两数之和

## 题目详情:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

标题

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

### 题目示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
解释:342 + 465 = 807.

### 解题思路
解决这个问题的步骤如下:

1. 初始化指针和虚拟节点:
     创建两个指针 `p` 和 `q`,用于遍历两个输入的链表 `l1` 和 `l2`。
    使用一个虚拟节点来简化结果链表头节点的管理。使用指针 `curr` 来添加新节点。

2. 遍历与相加:
   同时遍历两个链表直到它们的末尾(`p` 和 `q` 都变成 `nullptr`)。
   在每一步,从 `l1` 和 `l2` 的当前节点提取值。如果节点是 `nullptr`,则使用0作为该节点的值。
   计算这些值及上一个节点的和的进位的总和。
   要添加到结果链表的新数字是这个总和的个位数,新的进位是十位数。

3. 处理进位:
    遍历完两个链表后,如果还有剩余进位(例如,和导致额外的数字),应在结果末尾添加一个新节点。

4. 返回结果:
    结果链表从虚拟节点的下一个节点开始,因为虚拟节点用作初始占位符。

### 关键考虑
进位处理:这是至关重要的,因为两个数字的和可能超过9,需要传递到下一个节点。
长度不同:两个链表可能长度不同。算法应能处理当一个链表比另一个链表先遍历完的情况。
内存管理:在C++等语言中,需要正确创建和删除节点,以防内存泄漏。

第一次的错误代码:

问题和修正:

  1. 节点值的访问: 应使用 p->valq->val 而不是 *p*q
  2. 进位的处理: 当你计算 num 时应使用 num % 10 来获取新节点的值。
  3. 指针的更新: 你的条件检查有误,if(q.next!=nullptr) 应改为 if(q!=nullptr) q = q->next;
  4. 创建进位节点:carry 不为0时,你应创建一个节点值为 carry 的新节点,而不是 new ListNode(0)
  5. 循环条件的逻辑运算符: 应使用逻辑或 || 而不是按位或 |

太呆了,好久没写c++代码了,一开始就是很多低级错误,希望慢慢改进。

改进后的ac代码:

以下是leetcode上的一个大神的高效代码(写了一点小注释供大家参考,如有什么错误,请大家不不吝指出):

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值