携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入: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
- 题目数据保证列表表示的数字不含前导零
题目元素
- 每个链表的val值在[0,9]之间,一个链表表示一个整数,单个链表所包含的节点数在[1,100]之间,计算两个链表的累加链表
- 每个链表是按照逆序存储的,意思就是链表的最头部是数字的低,尾部是数字的高位。
解题思路
要对链表进行累加是从链表最头开始读取,然后将2个链表的当前值进行累加,没有的则计为0,大于十则向前进位。进位数为(x1+y1)/10,当前位置的新数值应该为(x1+y1)%10; x1对应第一个链表当前位置的数值,y1对应第二个链表当前位置的数值(注意此时链表1和链表二的循环层级应该保持一致);
还有个难点是除了代表数字0的链表值可以为0,其它数字如果最高位是0则直接去掉0; 如果当前层数时最后一层并且不是第一层且当前值为0时,直接忽略掉当前节点。
代码实现
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode res = new ListNode();
countByNode(l1,l2,res,0);
return res;
}
/**
* 对两个链表进行累加
* @param l1 第一个链表
* @param l2 第二个链表
* @param res 结果
* @param carry 进位值
*/
private void countByNode(ListNode l1, ListNode l2, ListNode res, int carry) {
int sum = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + carry;
// 新链表的值
res.val = sum % 10;
// 当前进位值
carry = sum / 10;
// 继续下次循环
ListNode next = new ListNode();
// 不要忽略还有种情况,当链表都为空,但是进位值有值时,仍然应该添加next链表
if ((l1 == null || l1.next == null) && (l2 == null || l2.next == null) && carry == 0){
return;
};
res.next = next;
countByNode(l1 != null ? l1.next : null,l2 != null ? l2.next : null,next,carry);
}