Skip to content

LeetCode

2. 两数相加

image.png

思路

image.pngimage.pngimage.png

题解

typescript
/**
 * 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) {
    // 新建一个预指针,用来指向头指针,返回链表结果pre.next
    let pre = new ListNode(0)
    // 定义一个用于进为的数
    let carry = 0 
    // 定义指针cur, 指向当前处理的节点,即两数之和的位置
    let cur = pre

    // cur , l1, l2 ; 三个指针移动
    while(l1 !== null || l2 !== null){
        // 如果l1不为null,取l1的值,否则取0补位
        let val1 = l1 ? l1.val : 0
        let val2 = l2 ? l2.val : 0
        let sum = val1 + val2 + carry

        // sum / 10 要进位的值
        carry = Math.floor(sum / 10 )
        // 计算当前位的值
        // sum = sum % 10 
        // 创建一个新节点,值为sum,将cur的next指向新节点
        cur.next = new ListNode(sum % 10 )

        // 移动l1, l2, cur
        if(l1 !== null) l1 = l1.next
        if(l2 !== null) l2 = l2.next
        cur = cur.next  
    }

    // 边界!加法运算时,如果最后一位大于10,还要进一位
    if(carry === 1){
        cur.next = new ListNode(carry)
    }
    return pre.next

};

image.png

typescript
var addTwoNumbers = function (l1, l2) {
    let dummy = new ListNode(0, null);
    let curr = dummy;
    let addOne = 0;

  // addOne 作为循环判断了,不需要最后 carry === 1
    while (l1 || l2 || addOne) {
        let val1 = l1 ? l1.val : 0;
        let val2 = l2 ? l2.val : 0;
        let sum = val1 + val2 + addOne;

        addOne = sum >= 10 ? 1 : 0;
        // 传null是因为少判断一点,性能还是有点提升 笑~~
        curr.next = new ListNode(sum % 10, null);
        curr = curr.next;

        l1 && (l1 = l1.next);
        l2 && (l2 = l2.next);
    }

    return dummy.next;
};