LeetCode-两数相加

LeetCode刷题笔记

LeetCode题库:https://leetcode-cn.com/problemset/all/

两数相加

给定两个非空链表代表两个非负整数,每个链表中的数字按照逆序方式存储,每个结点只存一个数字。将两数相加,返回相同形式的一个表示和的链表

给定链表

// 创建链表结点
function ListNode(val, next) {
    this.val = (val === undefined ? 0 : val);
    this.next = (next === undefined ? null : next);
}

// 创建链表
function creatList(arr) {
    var list = null;
    for (let i = arr.length - 1; i >= 0; i--) {
        list = new ListNode(arr[i], list);
    }
    return list;
}

const l1 = creatList([9, 9, 9, 9, 9, 9, 9]),
    l2 = creatList([9, 9, 9, 9]);

实现思路

使用循环来遍历两个链表,当两个链表都遍历完时跳出循环

  • 创建数组values,存放每个位上相加的结果
  • 定义一个变量over,表示上一位相加后是否进位
  • 当A链表遍历完成但B链表没有遍历完时,B链表的剩余结点遍历时仍计算A链表的结点,但结点值为0

代码实现

// 实现函数
var addTwoNumbers = function(l1, l2) {
    var over = false;		// 上一位相加是否大于10
    var next1 = l1;
    var next2 = l2;
    var values = [];		// 结果数组

    while (true) {
        let val = (next1 === null ? 0 : next1.val) + (next2 === null ? 0 : next2.val) + (over ? 1 : 0);
        over = val > 9;	// 先判断相加是否溢出
        val = over ? val - 10 : val;	// 再取个位上的数
        values.push(val);

        // 两个链表分别进入下一结点
        // 如果当前结点为空,则直接赋值null
        next1 = next1 === null ? null : next1.next;
        next2 = next2 === null ? null : next2.next;

        // 只有两个链表都为null时跳出循环,即计算结束
        if (next1 === null && next2 === null && !over) {
            break;
        }
    }

    var result = null;
    for (let i = values.length - 1; i >= 0; i--) {
        result = new ListNode(values[i], result);
    }

    return result;
};

console.log(addTwoNumbers(l1, l2));		// [8, 9, 9, 9, 0, 0, 0, 1]

执行结果

执行用时 内存消耗
152 ms 42.9 MB
posted @ 2021-05-30 19:30  陈嘉懿  阅读(52)  评论(0编辑  收藏  举报