算法問題(鏈表)--兩數相加&兩數相加II

LeetCode第2號題–兩數相加,445號題–兩數相加II

題目如下

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

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

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

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
//445. 兩數相加II
給定兩個非空鏈表來代表兩個非負整數。數字最高位位於鏈表開始位置。它們的每個節點只存儲單個數字。將這兩數相加會返回一個新的鏈表。

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

進階:

如果輸入鏈表不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。

示例:

輸入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出: 7 -> 8 -> 0 -> 7

解答
445號題是2號題的一個升級版

2.兩數相加

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        ListNode dummyHead = new ListNode(0);
        ListNode node = dummyHead;

        int count = 0;
        while (l1 != null || l2 != null || count != 0) {
            int val1 = l1 != null ? l1.val : 0;
            int val2 = l2 != null ? l2.val : 0;
            int sumVal = val1 + val2 + count;
            count = sumVal / 10;

            node.next = new ListNode(sumVal % 10);
            node = node.next;

            if (l1 != null)
                l1 = l1.next;
            if (l2 != null)
                l2 = l2.next;
        }
        return dummyHead.next;
    }

445號題我們同樣可以使用2號題的思想,但是需要先把兩鏈表進行反轉

445.兩數相加II:方法一

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode rev1 = reverseList(l1);
        ListNode rev2 = reverseList(l2);
        ListNode ret = null;
        ListNode pre = null;

        int count = 0;
        while (rev1 != null || rev2 != null || count != 0) {
            int val1 = rev1 != null ? rev1.val : 0;
            int val2 = rev2 != null ? rev2.val : 0;
            int sumVal = val1 + val2 + count;
            count = sumVal / 10;

            pre = ret;
            ret = new ListNode(sumVal % 10);
            ret.next = pre;

            if (rev1 != null)
                rev1 = rev1.next;
            if (rev2 != null)
                rev2 = rev2.next;
        }
        return ret;
    }

    public ListNode reverseList(ListNode cur) {
        ListNode ret = null;
        while (cur != null) {
            ListNode temp = cur.next;
            cur.next = ret;
            ret = cur;
            cur = temp;
        }
        return ret;
    }

445號題目中有一個進階
如果輸入鏈表不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。

如果要完成不對列表中的結點進行翻轉,我們可以使用雙棧法來解決這道題

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        //使l1和l2按照 逆序 的方式存儲在s1和s2
        LinkedList<Integer> s1 = new LinkedList<>();
        LinkedList<Integer> s2 = new LinkedList<>();
        while (l1 != null) {
            s1.addFirst(l1.val);
            l1 = l1.next;
        }
        while (l2 != null) {
            s2.addFirst(l2.val);
            l2 = l2.next;
        }

        int count = 0;
        ListNode ret = null;
        while (!s1.isEmpty() || !s2.isEmpty() || count != 0) {
            int a1 = 0, a2 = 0;
            if (!s1.isEmpty())
                a1 = s1.removeFirst();
            if (!s2.isEmpty())
                a2 = s2.removeFirst();
            count = (a1 + a2 + count) / 10;

            ListNode curNode = new ListNode((a1 + a2 + count) % 10);
            curNode.next = ret;
            ret = curNode;
        }
        return ret;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章