题目
题目描述
有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。
给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。
测试样例:
{1,2,3},{3,2,1}
返回:{4,4,4}
分析
引入一个flag,代表是否进位,每次按位相加之前,都要判断是否有进位;每次按位相加之后,都要判断是否需要进位。
代码
import java.util.*;
public class Plus {
public ListNode plusAB(ListNode a, ListNode b) {
//引入一个flag,代表是否进位
if(a==null && b==null){
return null;
}else if(a==null){
return b;
}else if(b==null){
return a;
}
boolean flag = false; //标记是否需要进位
ListNode c = new ListNode(0);
ListNode p1 = a;
ListNode p2 = b;
ListNode p3 = c;
int sum = 0; //sum为按位加和
while(p1!=null && p2!=null){
if(flag){
sum = p1.val+p2.val+1;
}else{ //没有进位
sum = p1.val+p2.val;
}
if(sum >= 10){ //又有进位
flag = true;
sum = sum-10;
}else{
flag = false; //将进位置为false
}
ListNode node = new ListNode(sum);
p3.next = node;
p3 = node;
sum = 0; //将sum重新置0
p1 = p1.next;
p2 = p2.next;
}
while(p1!=null){ //a的位数比b多
if(flag){
sum = p1.val+1;
}else{
sum = p1.val;
}
if(sum >= 10){ //又有进位
flag = true;
sum = sum-10;
}else{
flag = false; //将进位置为false
}
ListNode node = new ListNode(sum);
p3.next = node;
p3 = node;
sum = 0; //将sum重新置0
p1 = p1.next;
}
while(p2!=null){
if(flag){
sum = p2.val+1;
}else{
sum = p2.val;
}
if(sum >= 10){ //又有进位
flag = true;
sum = sum-10;
}else{
flag = false; //将进位置为false
}
ListNode node = new ListNode(sum);
p3.next = node;
p3 = node;
sum = 0; //将sum重新置0
p2 = p2.next;
}
if(flag){ //最后还有一个进位
ListNode node = new ListNode(1);
p3.next = node;
p3 = node;
}
return c.next;
}
}