题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
思路
这题一拿到手其实有俩思考点:
1、逆序,需不需要反转
自己动手写了一个例子突然发现想左了,逆序刚好不需要发转,因为链表读取刚好从头开始,加法也是从末位开始,所以逆序相当于加法顺序是正的。要是顺序才需要反转
2、进位
定义一个参数cur来储存进位
代码
代码有几个注意会写错忽略的点,在注释里面标出来了。
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// 边界条件
if (l1 == null){
return l2;
}
if (l2 == null){
return l1;
}
int cur=0,i=0,j=0,sum=0;
ListNode l3 = new ListNode(0);
ListNode a = l1,b=l2,c=l3;
// 这里循环终止条件要注意,要记得还有一个进位,然后位数可能不等,中间是或
// while(a != null || b != null){
while(a != null || b != null || cur != 0){
// 要考虑到a/b是null的情况
// i = a.val;
// j = b.val;
i = a == null ? 0 : a.val;
j = b == null ? 0 : b.val;
sum = i + j + cur;
// 和大于9则进1
cur = sum > 9 ? 1 : 0;
// 取个位:sum%10, 10的i次方:Math.pow(10,i)
ListNode k = new ListNode(sum%10);
c.next = k;
// 注意用到next要有null判断
if(a != null){
a = a.next;
}
if(b != null){
b = b.next;
}
c = c.next;
}
return l3.next;
}
}