题目描述
有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。
给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。
测试样例:
{1,2,3},{3,2,1}
返回:{4,4,4}
package Chapter2;
public class Plus {
// 题目描述
// 有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。
// 给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。
// 测试样例:
// {1,2,3},{3,2,1}
// 返回:{4,4,4}
public ListNode plusAB(ListNode a, ListNode b) {
if(a == null && b == null){
return null;
}
if(a == null){
return b;
}
if(b == null){
return a;
}
ListNode resultListNodeBegin=null;
ListNode resultListNodeEnd=null;
int counter=0;
while(a != null){
if(resultListNodeBegin == null){
int result=a.val+b.val+counter;
int val=result%10;
counter=result/10;
resultListNodeBegin=new ListNode(val);
resultListNodeEnd=resultListNodeBegin;
}else{
if(b == null){
resultListNodeEnd.next=a;
resultListNodeEnd=a;
break;
}
int result=a.val+b.val+counter;
int val=result%10;
counter=result/10;
ListNode tmp=new ListNode(val);
resultListNodeEnd.next=tmp;
resultListNodeEnd=tmp;
}
a=a.next;
b=b.next;
}
if(counter == 1){
if(b == null){
ListNode last=new ListNode(1);
resultListNodeEnd.next=last;
resultListNodeEnd=last;
}else{
while(b != null){
int result=b.val+counter;
int val=result%10;
counter=result/10;
ListNode tmp=new ListNode(val);
resultListNodeEnd.next=tmp;
resultListNodeEnd=tmp;
b=b.next;
}
if(counter == 1){
ListNode last=new ListNode(1);
resultListNodeEnd.next=last;
resultListNodeEnd=last;
}
}
}else{
if(b == null){
}else{
resultListNodeEnd.next=b;
resultListNodeEnd=b;
}
}
return resultListNodeBegin;
}
public static void main(String[] args){
ListNode a=ListNodeOperation.createListNode();
ListNode b=ListNodeOperation.createListNode();
ListNode ab=new Plus().plusAB(a,b);
ListNodeOperation.printListNode(ab);
}
}
需要注意的点:
a的链表取完之后 判断b时不要忘了counter可能还等于1 还要再次循环判断呢!
大神们的做法是一次while判断a!=null && b!=null && counter != 0
代码比较简洁,思路是差不多了。