繁体   English   中英

以链表的形式将两个数相加

[英]Adding two numbers in the form of a linked list

我是JavaScript的新手,我正在尝试解决这个问题:

给定两个非空链表,代表两个非负整数。 这些数字以相反的顺序存储,并且它们的每个节点都包含一个数字。 将这两个数字相加并将其作为链表返回。

这是我的解决方案:

addTwoNumbers = (l1, l2) => {
    let carry = 0;
    let p = curr = new ListNode(0);
    while (l1 || l2) {
        sum = 0;
        if (l1 && l2) {
            sum = l1.val + l2.val + carry;
        } else if (l1) {
            sum = l1.val + carry;
        } else if (l2) {
            sum = l2.val + carry;
        }
        carry = sum % 10;
        sum = sum / 10;
        curr.next = new ListNode(sum);
        curr = curr.next;
    }
    return p.next

};

LL的定义在这里,

class ListNode{
    constructor(val){
        this.val = val;
        this.next = null;
    }

}

这进入了无限循环。

我刚接触JavaScript,正在尝试解决此问题:

您将获得两个表示两个非负整数的非空链表。 这些数字以相反的顺序存储,并且它们的每个节点都包含一个数字。 将两个数字相加,然后将其作为链表返回。

这是我的解决方案:

addTwoNumbers = (l1, l2) => {
    let carry = 0;
    let p = curr = new ListNode(0);
    while (l1 || l2) {
        sum = 0;
        if (l1 && l2) {
            sum = l1.val + l2.val + carry;
        } else if (l1) {
            sum = l1.val + carry;
        } else if (l2) {
            sum = l2.val + carry;
        }
        carry = sum % 10;
        sum = sum / 10;
        curr.next = new ListNode(sum);
        curr = curr.next;
    }
    return p.next

};

LL的定义在这里,

class ListNode{
    constructor(val){
        this.val = val;
        this.next = null;
    }

}

这进入了无限循环。

这是我的版本:

const addTwoNumbers = (l1, l2) => {
    let carry = 0;
    let curr = new ListNode(0);
    let p = curr;

    while (l1 || l2) {
        const sum = (l1?.val || 0) + (l2?.val || 0) + carry;
        l1=l1?.next;
        l2=l2?.next;

        carry = sum > 9 ? 1 : 0;
        curr.next = new ListNode(sum % 10);
        curr = curr.next;
    }

    if(!!carry) {
        curr.next = new ListNode(1);
    }
    return p.next;
};

另一个解决方案:

const toArray = (l) => {
    const arr = []
    while(l) {
        arr.push(l.val)
        l = l.next;
    }
    return arr
}

const toList = (arr) => {
    let curr = new ListNode(0);
    let p = curr;
    for(const el of arr) {
        curr.next = new ListNode(el);
        curr = curr.next
    }
    return p.next;
}

const addTwoNumbers = (l1, l2) => {
    const la1 = toArray(l1)
    const la2 = toArray(l2)
    const len1 = la1.length
    const len2 = la2.length
    const lenMax = len1 > len2 ? len1 : len2
    
    let carry = 0;
    const result = []
    for (let i = 0; i < lenMax; i++) {
        const sum = (la1[i] || 0) + (la2[i] || 0) + carry;
        
        carry = sum > 9 ? 1 : 0;
        result.push(sum % 10);
    }
    carry && result.push(1)
    
    return toList(result)   
};

为什么这是不正确的?

var addTwoNumbers = function (l1, l2) {
    
    let num1 = parseInt(reverse(l1).join(''));
    let num2 = parseInt(reverse(l2).join(''));

    const newArr = Array.from(String(num1+num2), Number);

    return reverse(newArr);
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM