此题来自leetcode 445 传送门
题目简述:
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
这里题意很清楚,主要是对链表从末尾开始的元素进行操作,一般逆序操作果断选择用栈。
- 将两个链表的元素分别push进两个栈中。
- 同时取出栈顶的两个元素相加,注意:这里可能会大于10,所以此数要对10取余,并且要向下一位进1
- 构造链表的一个新节点,将取余的值插入到结点的数值域中,并且指针域指向已经构造好的链表的头节点ans,然后原来的头节点指针ans指向现在的头节点(也就是刚new的新节点),这样就能将构造的链表逆序了
- 重复2.3直到两个栈同时为空,且最后一次相加不需要向下一位进1(因为可能两个链表结点都出栈了,但是最后一位相加大于0,所以还要多申请一个结点)
细节已经加粗
AC代码:
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;
}
int carry = 0;
ListNode* ans = nullptr;
while (!s1.empty() || !s2.empty() || carry) {
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 curnode = new ListNode(cur);
curnode -> next = ans;
ans = curnode;
}
return ans;
}
};