版权声明:本文为博主原创文章,未经博主允许不得转载。 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类的方法,耗时和耗空间都比较大,需要进行优化。