[LeetCode]兩數相加(Add Two Numbers)

題目描述

給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲,它們的每一個節點只存儲單個數字。將兩數相加返回一個新的鏈表。
你能夠假設除了數字 0 以外,這兩個數字都不會以零開頭。java

示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
緣由:342 + 465 = 807

ListNode數據結構node

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

解決方法

遍歷鏈表對應相加便可,注意進位數據結構

方法一

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 爲方便操做加入的頭結點
        ListNode res = new ListNode(0);
        // 當前結點
        ListNode cur = res;
        // 進位標誌
        boolean[] flag = new boolean[1];

        // 兩鏈表對應位置相加
        while (l1 != null && l2 != null) {
            ListNode node = add(l1.val, l2.val, flag);
            cur.next = node;
            cur = node;

            l1 = l1.next;
            l2 = l2.next;
        }

        // 若是l1鏈表有剩餘,則剩下的與0相加
        while (l1 != null) {
            ListNode node = add(l1.val, 0, flag);
            cur.next = node;
            cur = node;
            l1 = l1.next;
        }

        // 若是l2鏈表有剩餘,則剩下的與0相加
        while (l2 != null) {
            ListNode node = add(0, l2.val, flag);
            cur.next = node;
            cur = node;
            l2 = l2.next;
        }

        // 若是鏈表末尾相加有進位則添加一個進位節點做爲尾節點
        if (flag[0])
            cur.next = new ListNode(1);

        return res.next;
    }

    public ListNode add(int v1, int v2, boolean[] flag) {
        int sum = v1 + v2;
        // 若是有進位則和+1
        if (flag[0]) {
            sum++;
            flag[0] = false;
        }
        // 產生進位
        if (sum > 9)
            flag[0] = true;
        // 獲取個位上的數
        return new ListNode(sum % 10);
    }

時間複雜度:O(max(M,N))。M,N分別爲l1,l2的鏈表長度code

基於方法一的改進

public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
        // 爲方便操做加入的頭節點
        ListNode res = new ListNode(0);
        // 當前節點
        ListNode cur = res;
        // 進位
        int carry = 0;

        // 兩鏈表對應相加
        while (l1 != null || l2 != null || carry != 0) {
            int sum = (l1 != null ? l1.val : 0) + (l2 != null ? l2.val : 0) + carry;
            // 獲取進位
            carry = sum / 10;
            // 獲取個位上的數
            ListNode node = new ListNode(sum % 10);
            cur.next = node;
            cur = node;
            l1 = l1 != null ? l1.next : null;
            l2 = l2 != null ? l2.next : null;
        }

        return res.next;
    }

時間複雜度:O(max(M,N))。M,N分別爲l1,l2的鏈表長度
原文地址:https://lierabbit.cn/2018/04/...get

相關文章
相關標籤/搜索