LeetCode刷题记录-2. 两数相加

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_41679123/article/details/88072940

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

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

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

示例:

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

解题代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
import java.math.BigInteger;
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        String str1=l1.val+"",str2=l2.val+"";
        ListNode p1=l1.next,p2=l2.next;
        while (p1!=null){
            str1+=p1.val;
            p1=p1.next;
        }
        while (p2!=null){
            str2+=p2.val;
            p2=p2.next;
        }

        String temp="";
        for (int i=str1.length()-1;i>=0;i--){
            temp+=""+str1.charAt(i);
        }
        str1=temp;

        temp="";
        for (int i=str2.length()-1;i>=0;i--){
            temp+=""+str2.charAt(i);
        }
        str2=temp;

        ListNode resulthead=new ListNode(0);
        ListNode resultp=resulthead;//尾指针


        try {
            int i1=0,i2=0,sum=0;
            i1=Integer.parseInt(str1.trim());
            i2=Integer.parseInt(str2.trim());
            sum=i1+i2;

            if (sum<0) throw new NumberFormatException();

            resulthead.val=sum%10;

            sum/=10;
            while (sum!=0){
                resultp.next=new ListNode(sum%10);
                sum/=10;
                resultp=resultp.next;
            }
        }catch (NumberFormatException e){

            BigInteger i1,i2,sum;
            i1=new BigInteger(str1.trim());
            i2=new BigInteger(str2.trim());
            sum=i1.add(i2);

            String bigSumStr=sum.mod(BigInteger.TEN).toString();
            int bigSumDigit=Integer.parseInt(bigSumStr);
            resulthead.val=bigSumDigit;

            sum=sum.divide(BigInteger.TEN);
            while (sum.compareTo(BigInteger.ZERO)>0){
                bigSumStr=sum.mod(BigInteger.TEN).toString();
                bigSumDigit=Integer.parseInt(bigSumStr);
                resultp.next=new ListNode(bigSumDigit);
                sum=sum.divide(BigInteger.TEN);
                resultp=resultp.next;
            }
        }

        return resulthead;
    }
}

解题思路:
首先将输入的节点逆序保存为字符串,然后尝试相加。如果发现超出整数限制,则使用java内置的BigInteger类,相加后将结果按位取出给节点赋值即可。如果没有超出整数限制,则直接使用整数相加,并且将和按位给节点赋值即可。

总结:
1、最初的想法,是直接将输入的节点逆序保存为字符串,然后将字符串转换为整数再相加。后来发现输入的节点值如果直接相加会出现超出整数最大值的限制,于是想到了将和分为两段,每段分别用整数保存的方法。后来发现相加的和可能会超出2个整数的范围,于是放弃了这种侥幸心理,直接采用java内置的BigInteger类。
2、还没有看题解,采用BigInteger类的方法,耗时和耗空间都比较大,需要进行优化。

猜你喜欢

转载自blog.csdn.net/sinat_41679123/article/details/88072940