2. 两数相加 LeetCode

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

分析:

       本题是大整数相加。如果将两个数存为基本类型,使用longlong型存储结果也会溢出。本题属于模拟题,通用做法是转化为字符串,然后模拟加法运算过程,最后按条件输出即可。本题的技巧在于仔细思考发现输出的每一个字符如‘7’、‘0’等可以直接输出,不需要先算出结果字符串。

通用方法:

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode listNode = new ListNode(0);
        ListNode listNode1 =listNode;
        String a="",b="",sum="";
        while (l1!=null){           //接收l1为字符串
            a +=String.valueOf( l1.val);
            l1=l1.next;

        }
        while (l2!=null){           //接收l2为字符串
            b +=String.valueOf(l2.val);
            l2=l2.next;
        }
        int jin=0,i;
        for ( i = 0; i <Math.min(a.length(),b.length()) ; i++) {    //模拟加法
            sum+= (jin+ a.charAt(i)-'0'+ b.charAt(i)-'0' )%10;
            jin =(jin+ a.charAt(i)-'0'+ b.charAt(i)-'0' )/10;
        }
        if (a.length()>b.length()){
            while (i<a.length()){
                sum += (jin+ a.charAt(i)-'0')%10;
                jin = (jin+ a.charAt(i)-'0')/10;
                i++;
            }
        }
        else if(a.length()<b.length()) {
            while (i<b.length()){
                sum += (jin+ b.charAt(i)-'0')%10;
                jin = (jin+ b.charAt(i)-'0')/10;
                i++;
            }
        }
        if(jin!=0) {
            sum +=jin;
        }
        String result= String.valueOf(sum);             //按规定输出
        for ( i = 0; i <result.length() ; i++) {
            listNode1.next=new ListNode(result.charAt(i)-'0');
            listNode1=listNode1.next;
        }
        return listNode.next;
    }

本题特例解法:

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode listNode = new ListNode(0);
        ListNode listNode1 =listNode;
        int carray=0;
        while(l1!=null || l2!=null || carray!=0){
            int temp= (l1 !=null ? l1.val:0) + (l2!=null? l2.val : 0 )+ carray ;
            carray=temp/10;
            listNode1.next=new ListNode(temp%10);
            if (l1 != null)l1=l1.next;
            if (l2 != null)l2=l2.next;
            listNode1= listNode1.next;
        }
        return listNode.next;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值