给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
分析一下
假设有链表
l1=[1,2,7,9]
l2=[6,7,5]
l3=[]
则根据规则:
9 7 2 1
+ 5 7 6
———1———————————
= 10 2 9 7
则程序最终结果为l3=[7,9,2,0,1]
回看链表l1,l2,l3
l1第一位1+l2第一位6=l3第一位【7】
l1第二位2+l2第二位7=l3第二位【9】
l1第三位7+l2第三位5=12,个位为l3第三位【2】,十位进一+l1第四位9=10,个位为l3第四位【0】,十位进一成为l3第五位【1】
所以l3=[(1+6)/10=0……7,(2+7)/10=0……9,(7+5)/10=1……2,(1+9)/10=1……0,1/10=0……1]=[7,9,2,0,1]
所以解题思路为,取两个链表的相同下标位相加,除10判断商是否为0,商为0则和不大于10,和即为所需要的数,下标加1继续计算,
若除10判断商大于1,则和大于等于10,取余10(%10)的数即为所需要记录的数,商则计入下一次相加。
验证1:有l1=[9,9,9,9,9,9,9],l2=[9,9,9,9],
则l3=[(9+9)/10=1……8,(1+9+9)/10=1……9,(1+9+9)/10=1……9,(1+9+9)/10=1……9,(1+9)/10=1……0,(1+9)/10=1……0,(1+9)/10=1……0,1/10=0……1]=[8,9,9,9,0,0,0,1]
9999999+9999=10009998,l3=[8,9,9,9,0,0,0,1]
验证通过。
验证2:有l1=[8,7,2,8],l2=[2,6,7]
l3=[(8+2)/10=1……0,(1+7+6)/10=1……4,(1+2+7)/10=1……0,(1+8)/10=0……9]=[0,4,0,9]
8278+762=9040,l3=[0,4,0,9]
验证通过。
很暴力的解了一下:
import java.util.*;
public class Test2 {
public static void main(String[] args) {
List<Integer> l1=new LinkedList<Integer>();
List<Integer> l2=new LinkedList<Integer>();
List<Integer> l3=new LinkedList<Integer>();
// l1.add(9);
// l1.add(2);
// l1.add(5);
// l2.add(1);
// l2.add(2);
// l2.add(3);
Integer o1=0,o2=0,o3=0,num=0;
for(int i=0;i<7;i++){
l1.add(9);
}
for(int i=0;i<4;i++){
l2.add(9);
}
Iterator i1=l1.iterator();
Iterator i2=l2.iterator();
while (i1.hasNext()||i2.hasNext()){
if (i1.hasNext()){
o1=(Integer) i1.next();
}else o1=0;
if (i2.hasNext()){
o2=(Integer) i2.next();
}else o2=0;
num=o1+o2+o3;
System.out.println("o1="+o1+"o2="+o2+"o3="+o3);
o3=0;
if (num/10==0){
l3.add(num);
}
if(num/10==1){
l3.add(num%10);
o3=1;
if(!i1.hasNext()&&!i2.hasNext()){
l3.add(o3);
}
}
}
System.out.println(l3);
}
}
验证了三组:
l1=[9,2,5],l2=[1,2,3]
l3=[0,5,8]