给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
原题如上
看来题解1,如下:
通过使用一个进位值来辅助链表数的相加。
我试着用Java写了如下代码(不完善的地方希望小伙伴给点建议):
package t2;
import java.util.LinkedList;
public class ADDlianbiao {
public static void main(String[] args) {
LinkedList<Integer> list1 = new LinkedList<>();//定义链表1
LinkedList<Integer> list2 = new LinkedList<>();//定义链表2
//向链表1中加入数据
list1.add(1);
list1.add(5);
list1.add(9);
//向链表2中加入数据
list2.add(7);
list2.add(2);
list2.add(3);
list2.add(4);
//951+4327=5278
//计算两个链表长度
int a=list1.size();
int b=list2.size();
//为循环做准备
int jinwei=0;//存储进位
String jg = "";//将结果转为字符串存储
//开始相加
for(int i=0;i<(a>b?a:b);i++){//遍历到最长的链表结束
//list1.size()>list2.size()
if (a > b){
if (i >= b){//为防止下标越界
if (jinwei == 0){//进位等于0,后面进位便不会产生,所以直接将数字加在后面就行
jg += list1.get(i);
}
if (jinwei != 0){//进位不等于0时,除了不用list2之外,其余和不越界时一样
int m = list1.get(i) + jinwei;
jinwei = m / 10;//更新进位数
jg += (m % 10);//存结果
}
}else {//没越界时,正常加
int m = list1.get(i) + list2.get(i) + jinwei;//保证每次循环都可以加上上次的进位数
jinwei = m / 10;//更新进位数
jg += (m % 10);//存结果
}
}
//list2.size()>list1.size()
if (b > a){
if (i >= a){
if (jinwei == 0){
jg += list2.get(i);
}
if (jinwei != 0){
int m = list2.get(i) + jinwei;
jinwei = m / 10;//更新进位数
jg += (m % 10);//存结果
}
}else {//没越界时,正常加
int m = list1.get(i) + list2.get(i) + jinwei;//保证每次循环都可以加上上次的进位数
jinwei = m / 10;//更新进位数
jg += (m % 10);//存结果
}
}
//list1.size()=list2.size()
if (a == b) {
int m = list1.get(i) + list2.get(i) + jinwei;//保证每次循环都可以加上上次的进位数
jinwei = m / 10;//更新进位数
jg += (m % 10);//存结果
}
}
//实现字符串的翻转
StringBuilder sb = new StringBuilder(jg);
String fjg = sb.reverse().toString();
System.out.println(fjg);
}
}
运行结果如下: