LeetCode:Add Two Numbers - 兩個鏈表逐項作帶進位的加法生成新鏈表

一、題目名稱java

Add Two Numbers (兩個鏈表逐項作帶進位的加法生成新鏈表)
node

二、題目地址git

https://leetcode.com/problems/add-two-numbers/
code

三、題目內容ip

英文:You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.leetcode

中文:給定兩個鏈表,其中的元素都是非負整數。將兩個鏈表的對應位置相加,若是兩數相加須要進位,則將進位帶到下一組加法。返回相加後的新鏈表。開發

例如:給出的鏈表爲(2 -> 4 -> 3)和(5 -> 6 -> 4),則返回的結果爲:7 -> 0 -> 8get

四、解題方法1it

我最開始的思路是,設兩個鏈表爲l1和l2,則依次向後遍歷兩鏈表。每次遍歷都須要考慮如下三點:io

一、考慮l1和l2有一個鏈表裏對應位置爲空的狀況

二、考慮新鏈表根節點和非根節點的狀況

三、考慮進位的狀況

一段實現此方法的Java代碼以下:

/**
 * 功能說明:LeetCode 2 - Add Two Numbers
 * 開發人員:Tsybius
 * 開發時間:2015年8月27日
 */
public class Solution {
    
    /**
     * 將兩個鏈表逐項相加,生成一個新鏈表,每次相加和大於10則進位到下一項
     * @param l1 鏈表1
     * @param l2 鏈表2
     * @return 新鏈表
     */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        
        ListNode listNodeRoot = null;
        ListNode listNodeCurr = listNodeRoot;
        int carry = 0;
        
        while (l1 != null || l2 != null)
        {
            //須要考慮l1和l2有一個爲空的狀況
            int sum = 0;
            if (l1 != null) {
                sum += l1.val;
            }
            if (l2 != null) {
                sum += l2.val;
            }
            sum += carry;
            
            //須要考慮根節點和非根節點的狀況
            if(listNodeRoot == null)
            {
                listNodeCurr = new ListNode(sum);
                listNodeRoot = listNodeCurr;
            }
            else
            {
                listNodeCurr.next = new ListNode(sum);
                listNodeCurr = listNodeCurr.next;
            }
            
            //須要考慮進位的狀況
            carry = 0;
            while (listNodeCurr.val >= 10) {
                listNodeCurr.val -= 10;
                carry += 1;
            }
            
            //向後遍歷
            if(l1 != null)    {
                l1 = l1.next;
            }
            if(l2 != null)    {
                l2 = l2.next;
            }
        }
        
        //考慮最後一次相加存在進位的狀況
        if (carry > 0) {
            listNodeCurr.next = new ListNode(carry);
        }
        
        return listNodeRoot;
    }
}

不事後來又寫出了更簡潔的代碼,下面這段Java代碼的大體思路與以前代碼一致,但減小了判斷,提升了效率。

/**
 * 功能說明:LeetCode 2 - Add Two Numbers
 * 開發人員:Tsybius
 * 開發時間:2015年8月27日
 */
public class Solution {
    
    /**
     * 將兩個鏈表逐項相加,生成一個新鏈表,每次相加和大於10則進位到下一項
     * @param l1 鏈表1
     * @param l2 鏈表2
     * @return 新鏈表
     */
      public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        
        ListNode listNodeRoot = new ListNode(0);
        ListNode listNodeCurr = listNodeRoot;
        int carry = 0;
        
        while (l1 != null || l2 != null || carry != 0)
        {
            //須要考慮l1和l2有一個爲空的狀況
            int sum = (l1 != null ? l1.val : 0) + (l2 != null ? l2.val : 0) + carry;

            //計算當前位和進位
            listNodeCurr.next = new ListNode(sum % 10);
            carry = sum / 10;
            
            //向後遍歷
            listNodeCurr = listNodeCurr.next;
            l1 = (l1 != null ? l1.next : null);
            l2 = (l2 != null ? l2.next : null);
        }
        
        return listNodeRoot.next;
    }
}

附:使用JavaScript語言實現的解題代碼(2016年1月23日加入)

/**
 * @param {ListNode} l1 鏈表1
 * @param {ListNode} l2 鏈表2
 * @return {ListNode} 將兩個鏈表逐項相加,生成一個新鏈表,每次相加和大於10則進位到下一項
 */
var addTwoNumbers = function(l1, l2) {
    var root = new ListNode(0);
    var curr = root;
    var carry = 0;
    while (l1 !== null || l2 !== null || carry !== 0) {
        var sum = (l1 !== null ? l1.val : 0) + (l2 !== null ? l2.val : 0) + carry;
        curr.next = new ListNode(sum % 10);
        carry = Math.floor(sum / 10);
        curr = curr.next;
        l1 = (l1 !== null ? l1.next : null);
        l2 = (l2 !== null ? l2.next : null);
    }
    return root.next;
};

END

相關文章
相關標籤/搜索