0
点赞
收藏
分享

微信扫一扫

[链表]BM11 链表相加(二)-中等

​​[链表]BM11 链表相加(二)-中等​​

知识点​​链表​​​​模拟​​

描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。数据范围:[链表]BM11 链表相加(二)-中等_链表反转,链表任意值 [链表]BM11 链表相加(二)-中等_栈_02

要求:空间复杂度 [链表]BM11 链表相加(二)-中等_加法_03,时间复杂度 [链表]BM11 链表相加(二)-中等_加法_03


例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。[链表]BM11 链表相加(二)-中等_加法_05

示例1

输入:

[9,3,7],[6,3]

复制返回值:

{1,0,0,0}

复制说明:

如题面解释

示例2

输入:

[0],[6,3]

复制返回值:

{6,3}

复制

备注:

1 \leq n, m \leq 10^61≤n,m≤106
0 \leq a_i, b_i \leq 90≤ai,bi≤9

题解

思路:

很简单,借助栈实现

#include <bits/stdc++.h>

struct ListNode
{
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(nullptr)
{
}
ListNode() = default;
};

ListNode *addInList(ListNode *head1, ListNode *head2)
{
if (head1 == nullptr)
{
return head2;
}

if (head2 == nullptr)
{
return head1;
}

std::stack<ListNode *> s1;
std::stack<ListNode *> s2;
int carray = 0;
while (head1 != nullptr)
{
s1.push(head1);
head1 = head1->next;
}

while (head2 != nullptr)
{
s2.push(head2);
head2 = head2->next;
}

std::stack<ListNode *> ans;
auto add_stack = [&ans](std::stack<ListNode *> &s, int &carray)
{
auto node = new ListNode(s.top()->val + carray);
carray = node->val / 10;
node->val = node->val % 10;
ans.push(node);
s.pop();
};

while (!s1.empty() || !s2.empty())
{
if (s1.empty())
{
add_stack(s2, carray);
continue;
}
if (s2.empty())
{
add_stack(s1, carray);
continue;
}
auto node = new ListNode(s1.top()->val + s2.top()->val + carray);
carray = node->val / 10;
node->val = node->val % 10;
ans.push(node);
s1.pop();
s2.pop();
}

if (carray > 0)
{
ans.push(new ListNode(1));
}

ListNode *list = nullptr;
ListNode *tail_node = nullptr;
while (!ans.empty())
{
if (list == nullptr)
{
list = ans.top();
tail_node = list;
}
else
{
tail_node->next = ans.top();
tail_node = tail_node->next;
}
ans.pop();
}
return list;
}
举报

相关推荐

0 条评论