js + leetcode刷題:No.2 兩數相加、445 兩數相加II

思路:基本上就是求和,注意進位,入鏈表

一、2 兩數相加

題目:

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

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

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

示例:

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

解法:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
    let num1 = l1.val.toString(), num2 = l2.val.toString()
    while(l1.next) {
        l1 = l1.next
        num1 = l1.val + num1
    }
    while(l2.next) {
        l2 = l2.next
        num2 = l2.val + num2
    }
    // 補齊位數
    let len1 = num1.length, len2 = num2.length, len = len1
    if(len1 > len2) {
        num2 = num2.padStart(len1, '0')
    }else if(len1 < len2) {
        num1 = num1.padStart(len2, '0')
        len = len2
    }
    // 逐位求和
    let carry = 0, sum = '', arr = []
    for(let i = len-1; i >= 0; i--) {
        let eachSum = Number(num1[i]) + Number(num2[i]) + carry
        carry = Math.floor(eachSum/10)
        arr.push(eachSum%10)
    }
    if(carry > 0){
        arr.push(carry)
    }
    // 入鏈表
    let last = null
    for(let j = arr.length-1; j >= 0; j--){
        let newNode = new ListNode(arr[j])
        if(last){
            newNode.next = last
        }
        last = newNode
    }
    return last
};

二、445 兩數相加II

題目:

  1. 兩數相加 II
    給你兩個 非空 鏈表來代表兩個非負整數。數字最高位位於鏈表開始位置。它們的每個節點只存儲一位數字。將這兩數相加會返回一個新的鏈表。
    你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。

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

示例:

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

解法:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
    let arr1 = [], arr2 = []
    while(l1.next){
        arr1.push(l1.val)
        l1 = l1.next
    }
    arr1.push(l1.val)
    while(l2.next){
        arr2.push(l2.val)
        l2 = l2.next
    }
    arr2.push(l2.val)
    // 保持同位
    let len1 = arr1.length, len2 = arr2.length, len = len1
    if(len1 > len2) {
        arr2 = arr2.join('').padStart(len1, '0').split('')
    }else if(len1 < len2) {
        arr1 = arr1.join('').padStart(len2, '0').split('')
        len = len2
    }
    // 求和,入鏈表
    let carry = 0, last = null
    for(let i = len-1; i >= 0; i--){
        let iNum = Number(arr1[i]) + Number(arr2[i]) + carry
        if(iNum >= 10) {
            iNum %= 10
            carry = 1
        }else{
            carry = 0
        }
        let newNode = new ListNode(iNum)
        if(last) {
            newNode.next = last
        }
        last = newNode
    }
    if(carry !== 0) {
        let newNode = new ListNode(carry)
        if(last) {
            newNode.next = last
        }
        last = newNode
    }
    return last
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章