给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
原题:https://leetcode-cn.com/problems/add-two-numbers/
示例 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
- 题目数据保证列表表示的数字不含前导零
思路:
数字逆序,也就是说,个位 -》十位-》百位 …
两个数相加,从个位算起,每个数位相加会有一个进位,可能是0也可能是1,所以,使用一个变量记录下进位。
进位初始为0,遍历链表,对应的两个数之和 + 进位,然后重新计算进位,继续遍历下一轮。直到l1或者l2结束了,然后如果l1比l2短的话,那么就将l1尾部指向l2剩下的数位。。。,l2后面的数字需要加上进位c。。。
代码实现:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode cur1 = l1;
ListNode pre1 = new ListNode(0, cur1);
ListNode cur2 = l2;
int c = 0;
while (cur1 != null && cur2 != null) {
cur1.val = cur1.val + cur2.val + c;
c = cur1.val / 10;
cur1.val = cur1.val % 10;
pre1 = cur1;
cur1 = cur1.next;
cur2 = cur2.next;
}
if (cur1 == null) {
//如果l1比l2短,则将l1的尾部指向l2剩下的【l2比l1多出来的那一段】
pre1.next = cur2;
cur1 = pre1.next;
}
while (cur1 != null) {
cur1.val = cur1.val + c;
c = cur1.val / 10;
cur1.val = cur1.val % 10;
pre1 = cur1;
cur1 = cur1.next;
}
if (c != 0) {
//多加一个节点
pre1.next = new ListNode(c);
}
return l1;
}