思路:
取出鏈表對應結點的值,相加結果存到新鏈表對應的結點,由於每個結點只存一位數,而相加結果有可能是兩位,因此需要進位,每次相加時將進位加入計算。
具體如下:
創建兩個結點用來分別遍歷兩個鏈表,都指向對應鏈表的首結點。
創建新鏈表存放結果,初始化值爲0,創建一個結點用來存放每次的結果,
1)遍歷兩鏈表,直到兩鏈表都爲空:
a:取出兩鏈表的值與進位carry相加爲sum,該值可能大於10,因此用carry保存每次相加的結果的進位進位值carry=sum/10,
b:將sum的個位(sum%10)存入新鏈表中下一個結點(這樣,提前創建了新的結點,新鏈表前移時就不會報空指針異常)
c:用於遍歷的兩個結點前進一步。
d: 新鏈表也前進一步。
2)最後,遍歷結束,判斷carry是否爲0,若不爲0,則將carry的值存入新鏈表的下一個結點。
參考代碼:
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode cur1=l1;
ListNode cur2=l2;
ListNode result=new ListNode(0);
ListNode cur=result;
int carry=0;
int x=0;
int y=0;
int sum=0;
while(cur1!=null||cur2!=null){
if(cur1!=null){
x=cur1.val;
}else{
x=0;
}
if(cur2!=null){
y=cur2.val;
}else{
y=0;
}
sum=x+y+carry;
carry=sum/10;
cur.next=new ListNode(sum%10);
cur=cur.next;
if(cur1!=null){
cur1=cur1.next;
}
if(cur2!=null){
cur2=cur2.next;
}
}
if(carry!=0){
cur.next=new ListNode(carry);
}
return result.next;
}