2.两数相加 - 力扣
力扣算法题Day2
**题目:**给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
1 | 输入:l1 = [2,4,3], l2 = [5,6,4] |
示例 2:
1 | 输入:l1 = [0], l2 = [0] |
示例 3:
1 | 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] |
提示:
- 每个链表中的节点数在范围
[1, 100]
内 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
解题思路:
首先数字是由链表逆序存储,那遍历这个链表的时候就是从最后一位开始遍历,这和我们一样我们计算两数相加计算时也是从最后一位开始。
相加时分两种情况:等长和不等长。
等长时两个数获取位次的次数也就是next的次数是一样的。
不等长时一个数位次获取完之后就停止获取下一位。另一个数继续获取下一位。
总结下来就是循环看数字还有没有下一位。
1 | while (p || q) { |
那我们就先把两个数字的最后一位相加,如果
19>两数之和>9,
那么有进位1,两数之和肯定大于等于10或者小于等于18,如果两数之和<10,那么没有进位或可以当成进位0,
进位可以直接让两数之和/10获得进位(C++中/运算符的特性),当前位余数为两数之和%10
进位需要在下一位运算时加上,后面的位次循环。
最后一位相加时如果有进位需要单独开一个节点存储进位1。
那么进位是从刚开始到最后都是需要的,可以初始化为0。
那么我们可以用下面的代码来表示上面的逻辑。
代码:
1 | /** |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 OneMe.Log!
评论