【leetcode】【2、兩數相加】

透明的阿爾馮斯發表於2020-12-03

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

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

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

第一眼看到題目的想法是,寫一個listNode與int的轉化方法,轉成int後計算結果,然後再int轉成listNode。
於是幾分鐘寫下如下程式碼:

    //連結串列轉int
    public static int toInt(ListNode l){
        int i = 1;
        int val = l.val;
        int res = i*val;
        while(l.next!=null){
            l = l.next;
            val = l.val;
            i=i*10;
            res += i*val;
        }
        return res;
    }

    //int轉連結串列
    public static ListNode toListNode(int l){
        int m = l%10;
        int n = l/10;
        ListNode res = new ListNode(m);
        ListNode head = res;
        while(n>0){
            m = n%10;
            n = n/10;
            ListNode node = new ListNode(m);
            res.next = node;
            res = node;
        }
        return head;
    }
    
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int v1 = toInt(l1);
        int v2 = toInt(l2);
        int sum = v1 + v2;
        return toListNode(sum);
    }

結果測試集無法通過!
原因是連結串列轉int時如果超過int最大值,這個方法就無效了,而測試用例中恰好有一個[9],[1,9,9,9,9,9,9,9,9,9]…
看來出題人本來就不打算讓我們“投機取巧”作整數運算,看來還是小看了這道題。

最終題解:
同時遍歷2個連結串列,每次遍歷時相加後取十位數值n用於下次節點相加計算,同時建立新節點;注意三種情況:倆個節點都不為空、l1為空、l2為空,以及臨界值n不為0的情況

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            int m = 0; int n = 0;
            ListNode tmp = new ListNode(-1);
            ListNode head = tmp;
            while(l1!=null && l2!=null){
                int v1 = l1.val;
                int v2 = l2.val;
                int res = v1 + v2 + n;
                m = res%10;
                n = res/10;
                ListNode p = new ListNode(m);
                tmp.next = p;
                tmp = p;
                l1 = l1.next;
                l2 = l2.next;
            }
            while(l1!=null){
                int res = l1.val + n;
                m = res%10;
                n = res/10;
                ListNode p = new ListNode(m);
                tmp.next = p;
                tmp = p;
                l1 = l1.next;
            }
            while(l2!=null){
                int res = l2.val + n;
                m = res%10;
                n = res/10;
                ListNode p = new ListNode(m);
                tmp.next = p;
                tmp = p;
                l2 = l2.next;
            }
            if(n!=0){
                ListNode p = new ListNode(1);
                tmp.next = p;
            }
            return head.next;
        }

相關文章