这是我参与更文挑战的第2天,活动详情查看: 更文挑战
今天抽出时间来继续做做leetcode的题,第2题两数相加,难度是中等,比昨天的两数之和要高,但是实际完全水题,从头到尾完全不用拐弯。
题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
思路
本质上,就是2个用数组来存储的数字进行求和。这题比一般的数组数字求和还简单一些,因为都是反向存储的,所以,直接个位、十位、百位不断向上推都是对齐的,连找到小数点把数位对齐的操作都不需要,直接从第一位(最低位)开始,逐位按位相加就好,思路如图所示
注意点
有2个注意点:
- 2个数字可能长度不相等,对应为取不到的时候,默认为0
- 相加注意进位,特别是最大的位,可能2个数在这一位都空了,但是因为上一位相加有进位,所以还会多出一位
Java版本代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// 返回结果,即头结点
ListNode result = null;
// 当前节点,next节点就挂载在当前节点后面
ListNode current = null;
// 进位
int carry = 0;
while (l1 != null || l2 != null) {
// 默认为0
int val1 = 0;
// 如果l1不为空,就是用l1的val
if (l1 != null) {
val1 = l1.val;
}
// val2做同样处理
int val2 = 0;
if (l2 != null) {
val2 = l2.val;
}
int sum = val1 + val2 + carry;
carry = sum / 10;
sum %= 10;
if (result == null) {
result = new ListNode(sum);
current = result;
} else {
ListNode next = new ListNode(sum);
current.next = next;
current = next;
}
// l1和l2都指向各自的下一个节点
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
if (carry > 0) {
ListNode next = new ListNode(carry);
current.next = next;
}
return result;
}
}