LeetCode 0445. 两数相加 II
Posted Tisfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0445. 两数相加 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 ) O(n+m) O(n+m),其中 n n n是第一个链表中的节点个数, m m m是第二个链表的节点个数
- 空间复杂度 O ( n + m ) O(n+m) O(n+m)
AC代码
C++
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
以上是关于LeetCode 0445. 两数相加 II的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 445. 两数相加 II(Add Two Numbers II)
LeetCode Java刷题笔记—445. 两数相加 II