1

LeetCode 2.两数相加

大家好,我是灵魂画师--茄子。技术水平一般,喜欢画画。

开始今天的正题。

2.两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解法:

1.循环法

思路:

  1. 创建一个进位标签,0就是不需要进位,1就是需要进位
  2. 创建一个新的ListNode
  3. 循环 计算节点的值相加,如果大于10则carry变成1。(在下一次循环中使用)
  4. 当前节点的值可以用 val % 10 来取
let addTwoNumbers = function(l1, l2) {
    let carry = 0; // 0就是不需要进位,1就是需要进位
    let retNode = new ListNode();
    let p = retNode;
    while(l1 || l2){
        let val = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + carry; // 计算值
        carry = val >= 10 ? 1:0; // 判断是否需要进位
        p.next = new ListNode(val % 10); //
        p = p.next;
        l1 != null ? l1 = l1.next:l1;
        l2 != null ? l2 = l2.next:l2;
    }
    if(carry){ // 最后一次进一位是不进入循环的 所以需要在这里特殊判断一下
        p.next = new ListNode(carry)
    }
    return retNode.next;
};

第二种写法:

let addTwoNumbers = function(l1, l2) {
    let retNode = new ListNode(0);
    let p = retNode;
    while(l1 || l2){
        let val = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + (p.val ? p.val : 0); // 计算值
        let carry = val >= 10 ? 1:0; // 判断是否需要进位
        p.val = val % 10; //
        l1 != null ? l1 = l1.next:l1;
        l2 != null ? l2 = l2.next:l2;
        if(carry != 0 || l1 != null || l2 != null){
            p.next = new ListNode(carry); //
        }
        p = p.next;
        
    }
    return retNode;
};

结合我的分析你是不是对这道题有了更清晰的认识了呢?

以上就是我的思路以及解法了,希望大家喜欢我,我会继续努力的ヾ(◍°∇°◍)ノ゙。(点个赞把我带走吧~~)


灵魂画师_茄子
11 声望4 粉丝