给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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;
}