[LeetCode打卡] 两数相加
题目
运行截图
代码
#include<iostream>
#include<stack>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
class Solution {
public:
ListNode* AddTwoNumbers(ListNode* l1, ListNode* l2) {
auto left = l1;
auto right = l2;
auto extraAdder = 0;
ListNode* ansList = nullptr;
ListNode* tailNode = nullptr;
while (left != nullptr && right != nullptr)
{
auto addAns = left->val + right->val + extraAdder;
extraAdder = addAns / 10;
auto targetValue = addAns - extraAdder * 10;
if (ansList == nullptr)
{
ansList = new ListNode(targetValue);
tailNode = ansList;
}
else
{
tailNode->next = new ListNode(targetValue);
tailNode = tailNode->next;
}
left = left->next;
right = right->next;
}
while (left != nullptr)
{
auto addAns = left->val + extraAdder;
extraAdder = addAns % 10;
auto targetValue = addAns - extraAdder * 10;
if (ansList == nullptr)
{
ansList = new ListNode(targetValue);
tailNode = ansList;
}
else
{
tailNode->next = new ListNode(targetValue);
tailNode = tailNode->next;
}
left = left->next;
}
while (right != nullptr)
{
auto addAns = right->val + extraAdder;
extraAdder = addAns % 10;
auto targetValue = addAns - extraAdder * 10;
if (ansList == nullptr)
{
ansList = new ListNode(targetValue);
tailNode = ansList;
}
else
{
tailNode->next = new ListNode(targetValue);
tailNode = tailNode->next;
}
right = right->next;
}
if (extraAdder)
{
tailNode->next = new ListNode(extraAdder);
}
return ansList;
}
void GetInput(ListNode*& left, ListNode*& right)
{
ListNode* l = nullptr, * r = nullptr;
int value;
cin >> value;
while (value)
{
if (l == nullptr)
{
left = new ListNode(value % 10);
l = left;
}
else
{
l->next = new ListNode(value % 10);
l = l->next;
}
value /= 10;
}
cin >> value;
while (value)
{
if (r == nullptr)
{
right = new ListNode(value % 10);
r = right;
}
else
{
r->next = new ListNode(value % 10);
r = r->next;
}
value /= 10;
}
}
void PrintListNode(ListNode*& listNode)
{
stack<int> value;
auto s = listNode;
while (s != nullptr)
{
value.push(s->val);
s = s->next;
}
int ans = 0;
while (!value.empty())
{
ans = ans * 10 + value.top();
value.pop();
}
cout << ans;
}
void ReleaseListNode(ListNode*& listNode)
{
stack<ListNode*> nodes;
auto s = listNode;
while (s != nullptr)
{
nodes.push(s);
s = s->next;
}
while (!nodes.empty())
{
delete nodes.top();
nodes.pop();
}
listNode = nullptr;
}
};
int main()
{
Solution s;
ListNode* left=nullptr, *right = nullptr;
while (true)
{
s.GetInput(left, right);
cout << "Left ";
s.PrintListNode(left);
cout << endl;
cout << "Right ";
s.PrintListNode(right);
cout << endl;
auto ans = s.AddTwoNumbers(left, right);
cout << "Ans ";
s.PrintListNode(ans);
cout << endl;
s.ReleaseListNode(left);
s.ReleaseListNode(right);
s.ReleaseListNode(ans);
}
}