题目描述:
有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。
给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。
测试样例:
{1,2,3},{3,2,1}
返回:{4,4,4}
思路1: 其实这道题是链表合并的问题,难点在于求每次相加后的进位,便于进行下次计算。要注意的是如果最后的进位是1,则需要再建立一个新的节点,该节点值为1。采用链表遍历,节点元素求和加进位计算,最后返回结果链表的头结点即可。
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Plus {
public ListNode plusAB(ListNode a, ListNode b) {
ListNode res=new ListNode(-1);//带头节点的结果链表
ListNode head=res;//记录结果链表的头结点
int cabit=0;//记录进位
while(a!=null&&b!=null){
int c1=a.val;
int c2=b.val;
int r=c1+c2+cabit;
if(r>=10){
cabit=1;
}else{
cabit=0;
}
int v=(r>=10)?r-10:r;
ListNode node=new ListNode(v);
res.next=node;
res=node;
a=a.next;
b=b.next;
}
while(a!=null){
int c1=a.val;
int r=c1+cabit;
if(r>=10){
cabit=1;
}else{
cabit=0;
}
int v=(r>=10)?r-10:r;
ListNode node=new ListNode(v);
res.next=node;
res=node;
a=a.next;
}
while(b!=null){
int c1=b.val;
int r=c1+cabit;
if(r>=10){
cabit=1;
}else{
cabit=0;
}
int v=(r>=10)?r-10:r;
ListNode node=new ListNode(v);
res.next=node;
res=node;
b=b.next;
}
if(cabit==1){
ListNode node=new ListNode(1);
res.next=node;
res=node;
}
return head.next;
}
}
思路2:将链表转换为整数,进行求和运算,然后将整数又转换为链表即可。
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
//先将链表转换为整数,然后进行计算。
public class Plus {
public ListNode plusAB(ListNode a, ListNode b) {
int num1=0;
int js=1;
while(a!=null){
int v=a.val;
num1+=v*js;
js=10*js;
a=a.next;
}
js=1;
int num2=0;
while(b!=null){
int v=b.val;
num2+=v*js;
js=js*10;
b=b.next;
}
int sum=num1+num2;
ListNode res=new ListNode(-1);
ListNode head=res;
//将整数的每位存到链表
while(sum!=0){
int k=sum%10;
sum/=10;
ListNode node=new ListNode(k);
res.next=node;//尾插
res=node;
}
return head.next;
}
}