题目描述
有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。
给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。
测试样例:
{1,2,3},{3,2,1}
返回:{4,4,4}
package jindian;
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Plus {
//方法1:比较容易想,先计算和,在每一位取出来加到链表
public ListNode plusAB(ListNode a, ListNode b) {
if(a==null)
return b;
if(b==null)
return a;
ListNode head=new ListNode(-1);
ListNode p=head;
ListNode p1=a,p2=b;
int sum=0;
while(p1!=null||p2!=null||sum!=0){
if(p1!=null){
sum+=p1.val;
p1=p1.next;
}
if(p2!=null){
sum+=p2.val;
p2=p2.next;
}
p.next=new ListNode(sum%10);//比如求得和sum=12,则sum%10=2,进位1
sum/=10;
p=p.next;
}
return head.next;
}
/*
//方法2:边计算每一位上数字,边加到链表中
public ListNode plusAB2(ListNode a, ListNode b) {
// write code here
ListNode resHead=new ListNode(-1);//新建一个链表
ListNode cur=resHead;
int addToNextDigit=0;//进位
//相当于边相加边将每一位上计算出来的数字添加到链表中
while(a!=null||b!=null||addToNextDigit!=0){// a: 4->5->6
// b: 6->2->4
//判断两个链表长度不一样时候,就补0对齐
int aVal = a != null ? a.val : 0;
int bVal = b != null ? b.val : 0;
int sum=aVal + bVal + addToNextDigit;;//4+6+0=10,因为首位是个位开始,因此进位进到后面和的数值上面
int nodeDigit=sum%10;//每一位对应求和之后数值取余,添加到链表中,如果超过10,比如12,将2添加,1进位,如果10,则0->
addToNextDigit=sum/10; //判断进位,sum不超过10就得0,进位为0,否则进位1/2/3,,
cur.next=new ListNode(nodeDigit);//将每一位的相加的对应数字添加进去
cur=cur.next;
*//*替换这样不对
a=a.next;
b=b.next;*//*
//计算链表上下一位对应数字
a = a != null ? a.next : null;
b = b != null ? b.next : null;
}
return resHead.next;
}*/
}