leetCode打卡——445 Add Two Number 2

207 阅读1分钟
var addTwoNumbers = function(l1, l2) {
    let val1 = 0;
    let val2 = 0;

    let l1NowNode = l1;
    let l2NowNode = l2;

    while (l1NowNode && l2NowNode) {
        val1 = val1 * 10 + l1NowNode.val;
        val2 = val2 * 10 + l2NowNode.val;

        l1NowNode = l1NowNode.next;
        l2NowNode = l2NowNode.next;
    }

    let extraVal = l1NowNode ? val1 : val2;
    let extraNowNode = l1NowNode || l2NowNode;

    while (extraNowNode) {
        extraVal = extraVal * 10 + extraNowNode.val;
        extraNowNode = extraNowNode.next;
    }
    if (l1NowNode) {
        val1 = extraVal;
    } else {
        val2 = extraVal;
    }
    /* 至此计算出两个链表代表的数字 */

    const sum = val1 + val2;
    const stack = [];

    if (sum === 0) {
        return new ListNode(0);
    }

    let nowSum = sum;
    while (nowSum) {
        stack.push(nowSum % 10);
        nowSum = Math.floor(nowSum / 10);
    }

    const resList = new ListNode(0);
    let nowResNode = resList;
    while (stack.length) {
        const nowVal = stack.pop();

        const newResNode = new ListNode(nowVal);

        nowResNode.next = newResNode;
        nowResNode = nowResNode.next;
    }
    
    return resList.next;
};

代码如上,将大象拆解的过程是这样的

1.根据传入的两个链表计算出他们对应的数字;

2.两者相加得到结果链表的数字;

3.将结果数字各位放在一个栈中;

4.利用该栈不断新生成结果节点。

然而,在No.1561 case中,是传入两个超长链表(也就是说是两个超大数字相加),大家都知道js的数字精度在两个超大数字相加是极容易丢失的,所以我们只能通过字符串的形式相加得到数字字符串。

利用leetcode 415题addStrings

// 将两个字符串数字相加返回
declare function addStrings(num1: string, num2: string) : string
var addTwoNumbers = function(l1, l2) {
    // 改动点
    let val1 = '';
    let val2 = '';

    let l1NowNode = l1;
    let l2NowNode = l2;

    while (l1NowNode && l2NowNode) {
        // 改动点
        val1 = val1 + l1NowNode.val;
        val2 = val2 + l2NowNode.val;

        l1NowNode = l1NowNode.next;
        l2NowNode = l2NowNode.next;
    }

    let extraVal = l1NowNode ? val1 : val2;
    let extraNowNode = l1NowNode || l2NowNode;

    while (extraNowNode) {
        // 改动点
        extraVal = extraVal + extraNowNode.val;
        extraNowNode = extraNowNode.next;
    }
    if (l1NowNode) {
        val1 = extraVal;
    } else {
        val2 = extraVal;
    }
    /* 至此计算出两个链表代表的数字字符串 */


    const sumStr = addStrings(val1, val2);


    if (sumStr === '0') {
        return new ListNode(0);
    }

    let nowSumStr = sumStr;
    const resList = new ListNode(0);
    let nowResNode = resList;
    while (nowSumStr) {

        const nowVal = nowSumStr[0];

        const newResNode = new ListNode(Number(nowVal));

        nowResNode.next = newResNode;
        nowResNode = nowResNode.next;

        nowSumStr = nowSumStr.slice(1);
    }
    
    return resList.next;
};