題目描述
有兩個用鏈表表示的整數(shù)凝果,每個結(jié)點包含一個數(shù)位耘拇。這些數(shù)位是反向存放的,也就是個位排在鏈表的首部铁材。編寫函數(shù)對這兩個整數(shù)求和尖淘,并用鏈表形式返回結(jié)果。
給定兩個鏈表ListNode* A著觉,ListNode* B德澈,請返回A+B的結(jié)果(ListNode*)。
測試樣例:
{1,2,3},{3,2,1}
返回:{4,4,4}
package Chapter2;
public class Plus {
// 題目描述
// 有兩個用鏈表表示的整數(shù)固惯,每個結(jié)點包含一個數(shù)位梆造。這些數(shù)位是反向存放的,也就是個位排在鏈表的首部葬毫。編寫函數(shù)對這兩個整數(shù)求和镇辉,并用鏈表形式返回結(jié)果。
// 給定兩個鏈表ListNode* A贴捡,ListNode* B忽肛,請返回A+B的結(jié)果(ListNode*)。
// 測試樣例:
// {1,2,3},{3,2,1}
// 返回:{4,4,4}
public ListNode plusAB(ListNode a, ListNode b) {
if(a == null && b == null){
return null;
}
if(a == null){
return b;
}
if(b == null){
return a;
}
ListNode resultListNodeBegin=null;
ListNode resultListNodeEnd=null;
int counter=0;
while(a != null){
if(resultListNodeBegin == null){
int result=a.val+b.val+counter;
int val=result%10;
counter=result/10;
resultListNodeBegin=new ListNode(val);
resultListNodeEnd=resultListNodeBegin;
}else{
if(b == null){
resultListNodeEnd.next=a;
resultListNodeEnd=a;
break;
}
int result=a.val+b.val+counter;
int val=result%10;
counter=result/10;
ListNode tmp=new ListNode(val);
resultListNodeEnd.next=tmp;
resultListNodeEnd=tmp;
}
a=a.next;
b=b.next;
}
if(counter == 1){
if(b == null){
ListNode last=new ListNode(1);
resultListNodeEnd.next=last;
resultListNodeEnd=last;
}else{
while(b != null){
int result=b.val+counter;
int val=result%10;
counter=result/10;
ListNode tmp=new ListNode(val);
resultListNodeEnd.next=tmp;
resultListNodeEnd=tmp;
b=b.next;
}
if(counter == 1){
ListNode last=new ListNode(1);
resultListNodeEnd.next=last;
resultListNodeEnd=last;
}
}
}else{
if(b == null){
}else{
resultListNodeEnd.next=b;
resultListNodeEnd=b;
}
}
return resultListNodeBegin;
}
public static void main(String[] args){
ListNode a=ListNodeOperation.createListNode();
ListNode b=ListNodeOperation.createListNode();
ListNode ab=new Plus().plusAB(a,b);
ListNodeOperation.printListNode(ab);
}
}
需要注意的點:
a的鏈表取完之后 判斷b時不要忘了counter可能還等于1 還要再次循環(huán)判斷呢烂斋!
大神們的做法是一次while判斷a!=null && b!=null && counter != 0
代碼比較簡潔屹逛,思路是差不多了础废。