两个数,每位都按照链表倒序存储。
求和,存入新的链表中。
代码
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(Integer.MIN_VALUE);
int c = 0;
ListNode cur = dummy;
while(l1!=null || l2!=null || c!=0){
int l2Val = 0;
int l1Val = 0;
if(l1!=null){
l1Val = l1.val;
l1 = l1.next;
}
if(l2!=null){
l2Val = l2.val;
l2 = l2.next;
}
int sum = l1Val+l2Val+c;
int cursum = sum>=10?sum-10:sum;
c = sum>=10?1:0;
ListNode newNode = new ListNode(cursum);
cur.next = newNode;
cur = cur.next;
}
return dummy.next;
}
}
1 逻辑很简单,但是很多细节容易忽略: 一个数结束了怎么办,两个数都结束了c不为1怎么办。
2 一开始选择判断两个数都不为null 来计算,会产生很多冗余代码。
3 选择只要一个数不为null 或者c 不为0 ,就能化整为零。
贴一下冗余代码
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(Integer.MIN_VALUE);
int c = 0;
ListNode cur = dummy;
while(l1!=null && l2!=null){
int sum = l1.val+l2.val+c;
int cursum = sum>=10?sum-10:sum;
c = sum>=10?1:0;
ListNode newNode = new ListNode(cursum);
cur.next = newNode;
cur = cur.next;
l1 = l1.next;
l2 = l2.next;
}
if(l1!=null){
while(l1!=null){
int sum = l1.val+c;
int cursum = sum>=10?sum-10:sum;
c = sum>=10?1:0;
ListNode newNode = new ListNode(cursum);
cur.next = newNode;
cur = cur.next;
l1 = l1.next;
}
}
if(l2!=null){
while(l2!=null){
int sum = l2.val+c;
int cursum = sum>=10?sum-10:sum;
c = sum>=10?1:0;
ListNode newNode = new ListNode(cursum);
cur.next = newNode;
cur = cur.next;
l2 = l2.next;
}
}
if(c>=1){
ListNode newNode = new ListNode(1);
cur.next = newNode;
}
return dummy.next;
}
}