題目:給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
思想:兩個鏈表從第一位開始相加,判斷是否進位來設置標誌位press,然後取餘留下,直到兩個鏈表同時耗盡,或者單個鏈表耗盡。然後分情況討論:
1、兩個鏈表都耗盡且press爲0,直接返回主鏈表。
2、都耗盡且press爲0,新建ListNode值爲1添加到主鏈表最後。
3、單個耗盡且press爲1(注意:這裏還是需要判斷是否進位)。
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int press=0,sum=0;
ListNode pre=l1;
ListNode later1=new ListNode(-1);
//ListNode later2=new ListNode(-1);
later1.next=l1;
//later2.next=l2;
while(pre!=null&&l2!=null){
sum=pre.val+l2.val+press;
press=sum>=10?1:0;
pre.val=sum%10;
later1=pre;
//later2=l2;
pre=pre.next;
l2=l2.next;
}
if(press==1&&pre==null&&l2==null){
later1.next=new ListNode(1);
}else if(pre!=null&&press==0){
pre.val=pre.val+press;
}else if(l2!=null&&press==0){
l2.val=l2.val+press;
later1.next=l2;
}else if(pre!=null&&press==1){
while(pre!=null){
if(press==0){
later1.next=pre;
break;
}else{
press=((pre.val+1)>=10?1:0);
pre.val=(pre.val+1)%10;
later1=pre;
pre=pre.next;
}
}
if(press==1){
later1.next=new ListNode(1);
}
}else if(l2!=null&&press==1){
while(l2!=null){
if(press==1){
press=((l2.val+1)>=10?1:0);
l2.val=(l2.val+1)%10;
later1.next=l2;
later1=later1.next;
l2=l2.next;
}else{
later1.next=l2;
break;
}
}
if(press==1){
later1.next=new ListNode(1);
}
}
return l1;
}
}
邏輯上很繞,不如遞歸的簡單思想簡單,但是得到的時間複雜度是線性的,時間複雜度與鏈表長度一致。
若有錯誤望指正。