Add Two Numbers
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
思路:流程图思想
一开始想高效点编写出代码,画出流程图,但是却因为未接触过java关于链表的结构而感到疑惑,其实跟指针差不多。
代码:应该能优化的。
public class Add2Numbers {
public ListNode add2Numbers(ListNode l1, ListNode l2){
ListNode p = new ListNode(0);
ListNode store = null;
if(l1==null||l2==null){//判断是否有空节点
if(l2!=null){
store = l2;
}
if(l1!=null){
store = l1;
}
return store;
}
store = p;//store存储头节点
int sum = l1.val+l2.val;
int c = sum/10;//c为进位数
store.val = sum%10;
l1 = l1.next;
l2 = l2.next;
while(l1!=null || l2!=null){
p.next = new ListNode(0);
p=p.next;
if(l1==null){
sum = l2.val+c;
l2=l2.next;
}else if(l2==null){
sum = l1.val+c;
l1=l1.next;
}else{
sum = l1.val + l2.val+c;
l1=l1.next;
l2=l2.next;
}
if(sum>9){
p.val=sum%10;
c = sum/10;
}else{
c=0;
p.val = sum;
}
}
if(c!=0){
p.next = new ListNode(c);
}
return store;
}
结果:
Run Status:
Accepted!
Program Runtime: 588 milli secs
Program Runtime: 588 milli secs
Run Status:
Accepted!
Program Runtime: 812 milli secs
Program Runtime: 812 milli secs
public ListNode add2Numbers(ListNode l1, ListNode l2){
ListNode store = null;
if(l1==null||l2==null){
if(l2!=null){
store = l2;
}
if(l1!=null){
store = l1;
}
return store;
}
ListNode p = new ListNode(0);
store = p;
int sum = l1.val+l2.val;
int c = sum/10;
if(c==1){//取余和减法哪个耗能?
store.val = sum-10;
}else{
store.val = sum;
}
l1 = l1.next;
l2 = l2.next;
while(l1!=null || l2!=null){
if(l1==null){
if(c==0){//无进位时没必要计算,直接嫁接链表
p.next=l2;
break;
}
sum = l2.val+c;//有必要用c么?
l2=l2.next;
}else if(l2==null){
if(c==0){
p.next=l1;
break;
}
sum = l1.val+c;
l1=l1.next;
}else{
sum = l1.val + l2.val + c;
l1=l1.next;
l2=l2.next;
}
if(sum>9){
p.next=new ListNode(sum-10);
c = 1;
}else{
c=0;
p.next = new ListNode(sum);
}
p=p.next;
}
if(c!=0){
p.next = new ListNode(c);
}
return store;
}