445.两数相加 II

【LetMeFly】445.两数相加 II

力扣题目链接:https://leetcode.cn/problems/add-two-numbers-ii/

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

 

示例1:

输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]

示例2:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]

示例3:

输入:l1 = [0], l2 = [0]
输出:[0]

 

提示:

  • 链表的长度范围为 [1, 100]
  • 0 <= node.val <= 9
  • 输入数据保证链表代表的数字无前导 0

 

进阶:如果输入链表不能翻转该如何解决?

方法一:栈

链表是从前往后的,加法是从后往前的。

因此,栈就很合适。

首先使用两个栈,把两个链表中的元素分别入栈。

这样,在出栈的时候,就是从两个“链表数字”的低位开始运算了。

存放答案的时候同理,我们同样开辟一个“答案栈”,因为是从低位开始运算的,而低位要放到链表最后边。

之后用一个数carry来存放“进位”,当有栈不空时,将栈顶元素取出并累加,将carry的个位入栈。

之后carry对10取模,十位变成新的“进位”

最终,将元素不断从答案栈中取出(是从高位开始取的),逐个添加到链表末尾即可。

  • 时间复杂度$O(n+m)$,其中$n$是第一个链表中的节点个数,$m$是第二个链表的节点个数
  • 空间复杂度$O(n+m)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
stack<int> st1, st2;
while (l1) {
st1.push(l1->val);
l1 = l1->next;
}
while (l2) {
st2.push(l2->val);
l2 = l2->next;
}
stack<int> added;
int carry = 0;
while (st1.size() || st2.size()) {
if (st1.size()) {
carry += st1.top();
st1.pop();
}
if (st2.size()) {
carry += st2.top();
st2.pop();
}
added.push(carry % 10);
carry /= 10;
}
if (carry)
added.push(carry);
ListNode* ans = new ListNode;
ListNode* p = ans;
while (added.size()) {
p->next = new ListNode(added.top());
added.pop();
p = p->next;
}
return ans->next;
}
};

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/127316269


445.两数相加 II
https://blog.letmefly.xyz/2022/10/14/LeetCode 0445.两数相加II/
作者
Tisfy
发布于
2022年10月14日
许可协议