最近爲了練習js代碼的熟練度,開始刷LeetCode。
“兩數相加“ 算是一個比較基本的題,值得關注的一點就是,這裏的輸入樣例是兩個鏈表。。。注意哦,是鏈表不是數組,這一點讓我做了好久,因爲他展示出來的樣例太像數組,而且我也從沒在js上用過鏈表,所以就默認數組做了半天,返回都是undefined = =
先貼一下題目(刷中文題還是很爽的):
這裏的 鏈表 的構造函數,是已經事先規定好的:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
這裏簡單講一下鏈表,首先我比較熟悉的是C語言的列表,但其實js的列表都是一樣的,都是需要我們寫節點的構造函數,通過next指向下一個節點,不同的是,C語言的指向是需要指針的,但對於 js 來講,給變量賦值對象數組之類的,本身就是將變量指向對象數組的存儲空間。
鏈表這種結構有哪些好處:
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;
}
如果有可以減少內存和時間的方法,麻煩提出給我學習一下,謝啦