题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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]
注意事项
定义链表ListNode时,
- 链表的首个值不能为0,当首个参数为0时,代表着链表为空。
- 只需要定义一个ListNode xx = new ListNode(0);即可。即只定义一个空链表。此时需要xx.next才能真正的指向他的header
- 不需要定义长度 。
赋值时
- 通过xx.next = new ListNode(4);来赋值,注意此时是赋值给下一个指针指向的位置,此时此链表一个值,值为4。
- 通过一个链表指向原链表地址,赋值完成时,打印原链表的指针地址。获取所有值。
取值时
- 取第一个值时,只需要xx.val即可。
- 取第二或之后的值时,需要xx = xx.next;int x = xx.val;这个方式取值。
解决方法
模拟法
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode number1 = new ListNode(0); // 用来定义一个空的链表
ListNode number2 = number1; // number2为目标链表
// 定义进位
int carry = 0;
/**
* 首先要明白 他是按照逆序的方式存进来的 也就是说同位置可以相加,
* 相加的结果就是两个数之和加上进位
*
* 举个例子:l1{2,0,4},l2{4,8,6},
* 那么他们相同的位置就是 2+4+carry,0+8+carry,4+6+carry
*
* 如果一个长一个短,那么短的就可以采取末尾补零的方法,这样不影响数值
*/
while (l1 !=null || l2 != null){
int x = l1 == null ? 0 : l1.val;
int y = l2 == null ? 0 : l2.val;
// 计算相同位置的和
int sum = x + y + carry;
// 进位就是两数的和与10 取整
carry = sum / 10;
// 存进去的数就是两数之和与10 取余
sum = sum % 10;
if (number1 == null) {
number1 = number2 = new ListNode(sum);
}else {
number2.next = new ListNode(sum);
number2 = number2.next;
}
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
/**
* 假如最后两个数相加之后大于10,那么进位就等于1,此时要把这个位数放到目标链表中
*/
if(carry == 1){
number2.next = new ListNode(carry);
}
return number2.next;
}
}

1216

被折叠的 条评论
为什么被折叠?



