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;
}

如果有可以减少内存和时间的方法,麻烦提出给我学习一下,谢啦

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