自己的思路:先把l1和l2取出来放到变量里面相加,再把相加出来的结果放大新的ListNode里面;

代码:

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
long num1=0;//l1的值
long num2=0;//l2的值
long n=1;//倍数
long sum=0;//总数
while(l1!=null){
num1+=l1.val*n;
n*=10;
l1=l1.next;
}
n=1;
while(l2!=null){
num2+=l2.val*n;
n*=10;
l2=l2.next;
}
sum=num1+num2;
String sumString = sum+"";
char[] chars = sumString.toCharArray();
ListNode listNode = new ListNode(Integer.parseInt(String.valueOf(chars[chars.length-1])));
ListNode listNodeReturn = listNode;
for(int i=chars.length-2;i>=0;i--){
ListNode listNodeTemp = new ListNode(Integer.parseInt(String.valueOf(chars[i])));
System.out.println(listNodeTemp.val);
listNode.next=listNodeTemp;
listNode=listNode.next;//这里是关键, 日日日日,否则不会循环
}
return listNodeReturn;
}
}

但是很遗憾这样子不得行,因为他的测试里面的测试数据都很长,超出了long的范围(223372036854775807即2的64次方) ,学会了要listNode=listNode.next 才能继续循环下去赋值,如果只是listNode.next=listNodeTemp的话,listNode.next还是同一个.

还是来看官方的吧: 官方是让l1和l2中的数字一个一个的相加, 用carry来代表进位值,这样不管多少数都不会越界了.

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    //官方的

    ListNode head=null,tail=null;
    int carry = 0; //进位值
    while(l1!=null||l2!=null){
        int n1=l1!=null?l1.val:0;//l1不为空,n1则取l1的val,为空则为0
        int n2=l2!=null?l2.val:0;//同l1
        int sum=n1+n2+carry;
        if(head==null){//初始化head和tail;
            head=tail=new ListNode(sum%10);
        }
        else{
            tail.next=new ListNode(sum%10);
            tail=tail.next;
        }
        carry=sum/10;
        if(l1!=null){
            l1=l1.next;
        }
        if(l2!=null){
            l2=l2.next;
        }
    }
    if(carry>0){
        tail.next=new ListNode(carry);
    }
    return head;
}