[leetcode] 2.两数相加

发布时间:2024年01月14日

题目描述

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

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

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

示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

解题方法

初来乍看,按照题目描述,我们可能需要把链表给翻转过来,变成正序的数字,然后两个正序的数字从低位到高位依次相加,低位超过10则向高位进1,最后算出正序的相加和,再把正序值翻转过来变成逆序值。如此一来,题目就解决了。这的确是种可行的方法,但是还有更好的方案。
仔细想一下,因为链表是逆序数字,其实链表的头节点就是正序数字的个位数,而下一个节点(如果有的话)就是十位数,依次类推后面就是百位、千位…… 我们直接就可以从头节点开始,依次相加两个数字,然后遍历到下一个节点,再次相加,直到链表遍历结束,得到两个链表相加后的数字。这样从链表头节点到尾节点,就是正序和的个位数、十位数、百位数…… 结果刚好是正序和的逆序排列。如此,题目就解决了。

java代码

链表结构

class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

两数相加方法

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    if (l1 == null) {
        return l2;
    }
    if (l2 == null) {
        return l1;
    }
    ListNode head = null;
    ListNode point = null;
    int add = 0;
    while (l1 != null && l2 != null) {
        int val = l1.val + l2.val + add;
        if (val > 9) {
            val = val % 10;
            add = 1;
        } else {
            add = 0;
        }
        if (head == null) {
            head = new ListNode(val);
            point = head;
        } else {
            point.next = new ListNode(val);
            point = point.next;
        }
        l1 = l1.next;
        l2 = l2.next;
    }
    while (l1 != null) {
        int val = l1.val + add;
        if (val > 9) {
            val = val % 10;
            add = 1;
        } else {
            add = 0;
        }
        point.next = new ListNode(val);
        point = point.next;
        l1 = l1.next;
    }
    while (l2 != null) {
        int val = l2.val + add;
        if (val > 9) {
            val = val % 10;
            add = 1;
        } else {
            add = 0;
        }
        point.next = new ListNode(val);
        point = point.next;
        l2 = l2.next;
    }
    if (add == 1) {
        point.next = new ListNode(1);
    }
    return head;
}

时间复杂度: O ( N ) O(N) O(N)
空间复杂度: O ( N ) O(N) O(N)

文章来源:https://blog.csdn.net/lvhao123456789/article/details/135529131
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。