LeetCode 👉 HOT 100 👉 两数相加 - 中等题

527 阅读2分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

题目

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

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

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

示例

image.png

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
    /**
     * 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) {

    }

思路

这道题的关键在于看懂数据结构;题目定义了一个构造函数 ListNode,接受两个参数,一个为基本类型的 val,一个为引用类型的 next,通过这个构造函数实例化出来的实例,将会拥有 valnext 属性。

题目要求返回的结构,也是上述定义的构造函数的实例。

解法:可以同时遍历两个链表,将相同节点的 val 取出相加,同时加上上一节的进位 num, 将相加后获得的值 对10求余,作为新节点的 val,同时将当前节点的进位赋值给 num;当遍历结束,需再次判断是否有进位 num,如有则需再次新建子节点。

代码如下

    /**
     * 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) {
        let ans = null, temp = null, num = 0;
        while(l1 || l2) {
            let value = 0;
            if(l1) {
                value += l1.val;
                l1 = l1.next;
            }
            if(l2) {
                value += l2.val;
                l2 = l2.next;
            }
            value += num;
            num = 0;

            if(!ans) {
                ans = temp = new ListNode(value % 10)
            } else {
                temp.next = new ListNode(value % 10);
                temp = temp.next;
            }
            num = Math.floor(value / 10);
        }
        if(num > 0) {
            temp.next = new ListNode(num)
        }
        return ans;
    };

注意

题目要求返回的是头节点,这也是为什么需要定义 anstempans 用于最后的结果返回,temp 用于遍历过程中的引用指向。

小结

LeetCode 👉 HOT 100 👉 两数相加 - 中等题

LeetCode 👉 HOT 100 👉 两数之和 - 简单题