思路:
- 遍历l1 l2,总有一个先结束(或同时);
- sum记录相同位的和,newval要考虑上进位的+1;个位上的和肯定不用进位;
- 新建个sumlist,和它的游标cursor,newval可能大于等于10,记得取余
- 第一个循环跳出,l1和l2可能还有一个没遍历完呢,第二个循环继续第一个循环所做的事
- 最后可能还需要再进一位,比如99 + 99 = 198 从两位变三位了,还是用flag=1判断是否要进位
下面这个烂代码是根据测试用例出现的问题,一点点打补丁修正的,所以有点烂。
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode sumlist = new ListNode();
ListNode cursor = sumlist;
int sum;
int flag=0;//进位标记
int newval;
while (l1 != null && l2 != null){
sum = l1.val + l2.val;
newval = sum + flag;
cursor.next = new ListNode(newval%10);
cursor = cursor.next;
if (newval >= 10){//判断进位
flag = 1;//进位1
}else{
flag = 0;//不进位得置零
}
sum = 0;//置零
newval = 0;
l1 = l1.next;
l2 = l2.next;
}
//l1或者l2还有一个没有读完,同样可能遗留下进位
if(l1 != null || l2 != null){
ListNode remain = (l1 != null?l1:l2 );
while (remain != null){
newval = remain.val + flag;
cursor.next = new ListNode(newval%10);
if (newval >= 10){//判断进位
flag = 1;//进位1
}else{
flag = 0;//不进位也得置零
}
newval = 0;
remain = remain.next;
cursor = cursor.next;
}
}
//最后再进一位,如果两数和的位数 大于 两数的位数
if(flag ==1){
cursor.next = new ListNode(flag);
}
return sumlist.next;
}
}
明显可以感觉到,第一第二个while可以并在一起啊,并且评论区也确实有这样干的大佬,借鉴了一下,不然真的不会哇
重点是:
- while循环多判断一下flag是否仍需进位,是,那么循环继续
- 如果一条链表比较长,那么遍历完短的,sum就不需要加短链表的值了,这个用两个if判断解决
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode sumlist = new ListNode();
ListNode cursor = sumlist;
int sum = 0;
int flag=0;
int newval;
while (l1 != null || l2 != null || flag != 0){
if (l1 != null) {
sum += l1.val;
l1 = l1.next;
}
if (l2 != null) {
sum += l2.val;
l2 = l2.next;
}
newval = (sum+ flag) ;
flag = newval/10;
cursor.next = new ListNode(newval%10);
cursor = cursor.next;
sum = 0;//置零
newval = 0;
}
return sumlist.next;
}
}