突然碰到一个medium的题,是真的medium啊,一下子就越界了,先没有用脑子用的int,然后发现long也总是转化成int,遂一怒之下用了biginteger,然后
Success
Details
Runtime: 173 ms, faster than 0.98% of Java online submissions for Add Two Numbers.
我哭了
我这个脑子
知识点
- java的单链表就是如此简洁,清晰,就在对象里面放对象,相比c的指针来说
- 构造函数如果重载了默认的,那么一定要用这个重载的构造进行初始化。比如这个题中, ListNode l3=new ListNode(0);一定要传参0,不能为空
- java所有变量都要赋初始值
- 对象如果只是为了和其他对象指向同一个空间,那可以不new,只声明类型
像ListNode p;
p=l1;
这样p的val next实际都是l1的,不用再自己构造
但如果这个p是想是要放进链表的结点,那么要new出来整个结构
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
import java.math.*;
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p;
p=l1;
BigInteger k=new BigInteger("1");
BigInteger num1=new BigInteger("0");
BigInteger num2=new BigInteger("0");
BigInteger temp1=new BigInteger("0");
BigInteger temp2=new BigInteger("0");
while(p!=null){
temp1=k.multiply(BigInteger.valueOf(p.val));
num1=num1.add(temp1);
System.out.println(num1);
k=k.multiply(new BigInteger("10"));
p=p.next;
}
p=l2;
k=new BigInteger("1");
while(p!=null){
temp2=k.multiply(BigInteger.valueOf(p.val));
num2=num2.add(temp2);
System.out.println(num2);
k=k.multiply(new BigInteger("10"));
p=p.next;
}
ListNode l3=new ListNode(0);
p=l3;
BigInteger sum=new BigInteger("0");
sum=num1.add(num2);
System.out.println(sum);
while(sum.compareTo(new BigInteger("0"))>0){
p.val=(sum.remainder(new BigInteger("10"))).intValue();
sum=sum.divide(new BigInteger("10"));
if(sum.compareTo(new BigInteger("0"))!=0){
ListNode q=new ListNode(0);
q.next=null;
p.next=q;
p=q;
}
}
p.next=null;
return l3;
}
}
后来仿造思路写了一遍
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p,q,curr;
p=l1;
q=l2;
ListNode l3=new ListNode(0);
curr=l3;
int i=0;
int x=0,y=0;
while(p!=null||q!=null){
if(p==null){
x=0;
}else{
x=p.val;
p=p.next;
}
if(q==null){
y=0;
}else{
y=q.val;
q=q.next;
}
int sum=x+y+i;
if(sum>=10)
{
i=1;
}
else
{
i=0;
}
curr.val=sum%10;
curr.next=null;
if(p!=null||q!=null){
ListNode n=new ListNode(0);
curr.next=n;
curr=n;
}
}
if(i==1){
ListNode a=new ListNode(1);
curr.next=a;
a.next=null;
}
return l3;
}
}
标准答案用了头结点,这样就不用管最后一个节点了
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode p = l1, q = l2, curr = dummyHead;
int carry = 0;
while (p != null || q != null) {
int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;
int sum = carry + x + y;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
if (carry > 0) {
curr.next = new ListNode(carry);
}
return dummyHead.next;
}