两数相加(链表求和)(二)
题目描述
- 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
- 如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
题解(C++)
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//定义两个栈
stack<int> s1, s2;
//以先入后出原则把链表的元素存入栈中
while (l1) {
s1.push(l1 -> val);
l1 = l1 -> next;
}
while (l2) {
s2.push(l2 -> val);
l2 = l2 -> next;
}
//定义carry变量记录进位数
int carry = 0;
//定义一个哑结点,用来连接新的链表
ListNode* ans = nullptr;
while (!s1.empty() || !s2.empty() || carry != 0) {
int a = s1.empty() ? 0 : s1.top();
int b = s2.empty() ? 0 : s2.top();
//移除栈顶元素
if (!s1.empty()) s1.pop();
if (!s2.empty()) s2.pop();
int cur = a + b + carry;
carry = cur / 10;
cur %= 10;
//把新的节点以头插法插入到新的链表中
//auto的原理就是根据后面的值,来推测前面的类型是什么
auto curnode = new ListNode(cur);
curnode -> next = ans;
ans = curnode;
}
return ans;
}
};
图示
详解
- 因为题目要求,我们无法对链表进行反转,所以我们需要用到栈的先入后出原则
- 1>.先定义两个栈,在分别把两个链表的节点存入到两个栈中
- 2>.定义一个哑结点,用来连接两数相加后产生的新节点
- 3>.把两栈中的top节点的值进行相加,用完后删除栈顶元素。
- 4>.这里相加的结果需要考虑进位数,最后把相加的结果以头插法连接到新链表中。
- 这里注意遍历的终止条件为 stack1,stack2 都为空,且 count 为 0 时。
注意
- 这里当然可以先把两链表进行反转,再用头插法连接新链表,但是当题目要求不能移动节点时,栈的先入后出特性为我们很好地解决了这个问题。
难点
对于栈的特性的了解及其函数的运用
声明
- 原作者:E.L.E
- <本文章著作权归作者所有,商业转载请获得作者授权,非商业转载请注明出处>
- <欢迎大家评论>