LeetCode 兩數相加

最近爲了練習js代碼的熟練度,開始刷LeetCode。
“兩數相加“ 算是一個比較基本的題,值得關注的一點就是,這裏的輸入樣例是兩個鏈表。。。注意哦,是鏈表不是數組,這一點讓我做了好久,因爲他展示出來的樣例太像數組,而且我也從沒在js上用過鏈表,所以就默認數組做了半天,返回都是undefined = =

先貼一下題目(刷中文題還是很爽的):
在這裏插入圖片描述

這裏的 鏈表 的構造函數,是已經事先規定好的:

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

這裏簡單講一下鏈表,首先我比較熟悉的是C語言的列表,但其實js的列表都是一樣的,都是需要我們寫節點的構造函數,通過next指向下一個節點,不同的是,C語言的指向是需要指針的,但對於 js 來講,給變量賦值對象數組之類的,本身就是將變量指向對象數組的存儲空間。
weki上面的結構圖
鏈表這種結構有哪些好處:
1、插入方便,直接通過next的指向插入就好了,只需操作插入位置的前後兩個節點
2、刪除方便

鏈表這種結構有哪些不方便之處:獲取鏈表中第n個節點,需要遍歷才能知道,而數組只需要arr[n]即可

好了,以上皆是我的理解,比較。。。片面吧,深一點就自己去研究吧

接下來我貼一下我這道題的代碼(存儲空間用的比較多,需要優化,不過題目是AC了的):

/**
 * 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 = listToArray(l1);
    let arr2 = listToArray(l2);
    
    let len1 = arr1.length;
    let len2 = arr2.length;
    let len  = Math.max(len1, len2);
    let ans  = []; 
    let ansList = null;
    let z = 0;
    
    for(let i = 0; i < len; i++) {
        let x = i < len1 ? arr1[i] : 0;
        let y = i < len2 ? arr2[i] : 0;
        
        let ans_item = add(x, y, z);
        z = ans_item[0];
        ans.push(ans_item[1]);
    }
    if(z > 0) {
        ans.push(z);
    }
    
    ansList = arrayToList(ans);
    
    return ansList;
};

function add(x, y, z) {
    return [(x + y + z)/10-((x + y + z)%10/10), (x + y + z)%10];
}

function arrayToList(arr) {
    let list = new ListNode(arr[0] ? arr[0] : 0);
    let item = list;
    for(let i = 1; i < arr.length; i++) {
        item.next = new ListNode(arr[i]);
        item = item.next;
    }
    
    return list;
}

function listToArray(list) {
    let arr = [];
    while(list) {
        arr.push(list.val);
        list = list.next;
    }
    return arr;
}

如果有可以減少內存和時間的方法,麻煩提出給我學習一下,謝啦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章