最近为了练习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;
}
如果有可以减少内存和时间的方法,麻烦提出给我学习一下,谢啦