自己的思路:先把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;
}
暂无评论