Leetcode 02 两数相加

349 阅读1分钟

GitHub-LT-02-源码 :large_blue_diamond:加法进位

问题描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

解法:

  • 执行用时:24 ms, 在所有 C++ 提交中击败了98.64%的用户
  • 内存消耗:9.3 MB, 在所有 C++ 提交中击败了100.00%的用户

算法复杂度 O(n) 取决于链表中较长的

class Solution
{
public:
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
    {
        //* 本质就是两数两加,不用管链表的倒序
        //* 使用头指针
        ListNode preHead(0), *p = &preHead; //* 链表的头节点
        int tempSum = 0;                    //* 临时保存两数之和
        while (l1 || l2 || tempSum)//* 或tempSum 是因为可能最高位产生进位,此时需要再建一个ListNode
        {
            //* 求两数之和
            if (l1)
                tempSum += l1->val, l1 = l1->next;
            if (l2)
                tempSum += l2->val, l2 = l2->next;
            p->next = new ListNode(tempSum % 10); //* 余数作为结果值
            tempSum /= 10;                        //* 进位
            p = p->next;
        }
        return preHead.next;
    }
};