【JS攻略Leetcode】No.2. Add Two Numbers(兩數(shù)相加)

引言:用Js攻略leetcode中的算法,將會介紹自己的思路和注意點,一邊學習一邊愉快刷題呀。

問題1:

給定兩個非空鏈表來表示兩個非負整數(shù)。位數(shù)按照逆序方式存儲,它們的每個節(jié)點只存儲單個數(shù)字。將兩數(shù)相加返回一個新的鏈表。
你可以假設除了數(shù)字 0 之外,這兩個數(shù)字都不會以零開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

思考:

  1. 342 + 465 = 807 也就是位位相加,注意一下每一位相加要加上進位,最后一次兩個鏈表都到了結束,也要注意一下有沒有進位:比如 99 + 1 = 100;
  2. 注意鏈表怎么把每個節(jié)點連接起來:每次生成一個listnode元素,通過當前l(fā)istnode的下一個元素(cur_node.next)連城鏈。
  3. 最后返回一個列表,所以要給個頭(result)指示列表起始的位置,再通過cur_node鏈接起鏈表串

代碼:

/**
* Definition for singly-linked list.
* function ListNode(val) {
*     this.val = val;
*     this.next = null;
* }
*/

var addTwoNumbers = function(l1, l2) {
    var val1 = 0;
    var val2 = 0;
    var carry = 0;//進位
    var result = null;//返回值
    var cur_node = null;

    var sumWithCarry = function(sum) {
        if(sum >= 10) {
            carry = 1;
            sum = sum - 10;
        } else {
            carry = 0;
        }
        return sum;
    }

    if(l1 || l2) {
        val1 = l1 ? l1.val : 0;
        val2 = l2 ? l2.val : 0;
        l1 = l1 ? l1.next : null;
        l2 = l2 ? l2.next : null;
        cur_node = new ListNode(sumWithCarry(val1 + val2));
        result = cur_node;
        while(l1 || l2) {
            val1 = l1 ? l1.val : 0;
            val2 = l2 ? l2.val : 0;
            l1 = l1 ? l1.next : null;
            l2 = l2 ? l2.next : null;
            cur_node.next = new ListNode(sumWithCarry(val1 + val2 + carry));
            cur_node = cur_node.next;
        }
        if(carry != 0) {
            cur_node.next = new ListNode(sumWithCarry(carry));
        }
    }
    return result;
};

問題2:

如果鏈表中的數(shù)字不是按逆序存儲的呢?例如:
(3 -> 4 -> 2) + (4 -> 6 -> 5) = 8 -> 0 -> 7
符合人類觀察的習慣: 342+465 = 807

思路:

  1. 思路1也是位位相加, 將兩個列表中的值存入數(shù)組中:result_array = [3+4, 4+6, 2+5] = [7,10, 7], 再考慮進位為題變成 [ 8, 0, 7 ], 最后生成listnode連接起來。但是這種方法在列表不等長的情況下是不可行了,可跳過去看最后。
var addTwoNumbers = function(l1, l2) {
    var result_array = [];
    var result = null;//返回值
    var cur_node = null;
    var val1 = 0;
    var val2 = 0;
    while(l1 || l2) {
        val1 = l1 ? l1.val : 0;
        val2 = l2 ? l2.val : 0;
        l1 = l1 ? l1.next : null;
        l2 = l2 ? l2.next : null;
        result_array.push(val1 + val2)
    }
    for (var i = result_array.length - 1; i >= 0; i--) {
        if(result_array[i] >= 10) {
            result_array[i] = result_array[i] - 10;
            if(i > 0) {
                result_array[i -1] = result_array[i-1] + 1;
            } else {
                result_array.unshift(1);
                return;
            }
        }
    }
    if( result_array.length ){
        result = new ListNode(result_array[0]);
        cur_node = result;
        if(result_array.length > 1) {
            for (var i = 1; i <= result_array.length - 1; i ++) {
                cur_node.next = new ListNode(result_array[i]);
                cur_node = cur_node.next;
            }
        }
    }
    
    return result;
};

乍看起來非常完美,但是遇到了一個極其重要的邏輯問題:在處理兩列表等長時這個方法可行,但是不等長時相加錯誤,比如: [9,9] + [2] = [9, 11]=[1,0,1], 但上述辦法算出來是[11,9]=[1,1,9],所以在兩列表不等長時,必須將相加位位置對齊,在另一個列表元素數(shù)組前面加上很多0;但是我覺得這種方式時間復雜度太高了。

  1. 思路2:然后我想為什么不能將它們變?yōu)閿?shù)字再進行相加呢?[9,9] + [2] = 99 + 2 = 101 = [1,0,1]

代碼:

var addTwoNumbers = function(l1, l2) {
    var result_array = [];
    var result_sum = 0;
    var result1 = 0;
    var result2 = 0;
    var result = null;//返回值
    var cur_node = null;
    
    var val1 = 0;
    var val2 = 0;

    while(l1 || l2) {
        val1 = l1 ? l1.val : 0;
        l1 = l1 ? l1.next : null;
        result1 = val1 + result1*10;
        val2 = l2 ? l2.val : 0;
        l2 = l2 ? l2.next : null;
        result2 = val2 + result2*10;
    }
    result_sum = result1 + result2;
    while(result_sum >= 10) {
        result_array.push(result_sum % 10);
        result_sum = ~~(result_sum / 10);
    }
    result_array.push(result_sum);

    if( result_array.length ){
        for (var i = result_array.length - 1; i >= 0; i--) {
            if(i == result_array.length - 1) {
                result = new ListNode(result_array[i]);
                cur_node = result;
            } else {
                cur_node.next = new ListNode(result_array[i]);
                cur_node = cur_node.next;
            }
        }
    }
    return result;
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容