【LeetCode】2. 两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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]

提示:

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零
分析一下
假设有链表
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]

【LeetCode】2. 两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和_第1张图片

l1=[8,7,2,8],l2=[2,6,7]
l3=[0,4,0,9]

【LeetCode】2. 两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和_第2张图片

l1=[9,9,9,9,9,9,9],l2=[9,9,9,9]
l3=[8,9,9,9,0,0,0,1]

【LeetCode】2. 两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和_第3张图片
END

你可能感兴趣的:(java,leetcode,链表,算法)