Leetcode 兩數相加 Java非遞歸實現

題目:給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。

如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。

您可以假設除了數字 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;
    }
}

邏輯上很繞,不如遞歸的簡單思想簡單,但是得到的時間複雜度是線性的,時間複雜度與鏈表長度一致。
若有錯誤望指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章