leecode #2 两数相加 前端小白技术自救日常

两数相加js版

题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
在这里插入图片描述

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

我的解法(写错了)

小白,数据结构太久之前学的,忘记了链表结构该怎么写了,最终输出的是数组,不符合题解
/**

  • @param {ListNode} l1
  • @param {ListNode} l2
  • @return {ListNode}
    */
    var addTwoNumbers = function(l1, l2) {
    let c1 = 0;
    let c2 = 0;
    let flag1 = 1;
    let flag2 = 1;
    let result = [];
    for (let i = l1.length - 1; i >= 0; i–) {
    c1 += l1[i] * flag1;
    flag1 *= 10;
    }
    for (let i = l2.length - 1; i >= 0; i–) {
    c2 += l2[i] * flag2;
    flag2 *= 10;
    }
    let re = c1 + c2;
    let flag3 = 10
    while (re >= 0) {
    result.push(re % flag3)
    re -= re % flag3;
    re /= 10;
    if (re == 0) {
    break;
    }
    }
    return result

};

大佬解法

/**

  • Definition for singly-linked list.

  • function ListNode(val, next) {

  • this.val = (val===undefined ? 0 : val)
    
  • this.next = (next===undefined ? null : next)
    
  • }
    /
    /
    *

  • @param {ListNode} l1

  • @param {ListNode} l2

  • @return {ListNode}
    */
    var addTwoNumbers = function(l1, l2) {
    var l1Node = l1
    var l2Node = l2
    var args = [] // 存储对应的位置相加的结果
    var needAdd1 = 0
    // 先不考虑进位,对应的链表每一位相加
    while(l1Node||l2Node) {
    // 考虑两个链表长度不同的情况
    // var val1 = l1Node && l1Node.val || 0
    // var val2 = l2Node && l2Node.val || 0
    var val1 = l1Node ? l1Node.val : 0
    var val2 = l2Node ? l2Node.val : 0
    var temp = val1 + val2
    args.push(temp)
    l1Node && (l1Node = l1Node.next)
    l2Node && (l2Node = l2Node.next)
    }
    // 考虑进位的问题
    for (let i = 0; i < args.length; i++) {
    if(args[i] > 9) {
    args[i] -= 10
    if (args[i+1] === undefined) {
    args[i+1] = 1
    } else {
    args[i+1] += 1
    }
    }
    }
    // 把数组转成成链表(递归)
    function createList (…argu) {
    if (argu.length > 0) {
    var nodeStart = new ListNode(argu[0])
    argu.shift()
    nodeStart.next = createList(…argu)
    return nodeStart
    } else {
    return null
    }
    }

    return createList(…args)
    };

大佬解法(2)

var addTwoNumbers = function(l1, l2) {
let l3 = new ListNode();
let p1 = l1; //不要直接操作原链表
let p2 = l2;
let p3 = l3;
let carry = 0; //进位判断
while(p1 || p2) {
const val1 = p1 ? p1.val : 0;
const val2 = p2 ? p2.val : 0;
const val = Math.floor((val1 + val2 + carry) % 10);
carry = Math.floor((val1 + val2 + carry) / 10);
p3.next = new ListNode(val);
if(p1) p1 = p1.next;
if(p2) p2 = p2.next;
p3 = p3.next;
}
if(carry) { //判断最后一位是否有进位
p3.next = new ListNode(carry);
}
return l3.next;
}
复杂度分析:

事件复杂度: O(max(m,n)),m,n分别为两个链表的长度
空间复杂度: O(1),返回值不计入空间复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值