//这道题需要从后面往前算,但是单链表不能逆向遍历,此时空间复杂度要求O(n),可以用栈存储起来,就可以逆向遍历了
//这里两个数相加最多是大的链表长度加1,为啥呢,假如两个两位数相加,最大也是小于两个最小的三位数相加,
//如 99+99 = 198(三位),100+100=200(三位),所以可以存储在长的链表中,然后看借进位是否大于0,大于零new一个节点存贮借进位,然后指向存储节点的头节点,这里注意长度相等的话,都得存储
#include <stack>
class Solution {
public:
/**
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
ListNode* addInList(ListNode* head1, ListNode* head2)
{
int size1 = 0;
int size2 = 0;
stack<ListNode*> sta1;
stack<ListNode*> sta2;
ListNode* pNode1 = head1;
ListNode* pNode2 = head2;
while(pNode1||pNode2)
{
if(pNode1)
{
size1++;
sta1.push(pNode1);
pNode1 = pNode1->next;
}
if(pNode2)
{
size2++;
sta2.push(pNode2);
pNode2 = pNode2->next;
}
}
ListNode *head = new ListNode(-1);
head->next = nullptr;
int c = 0;//借进位
while(!sta1.empty()||!sta2.empty())
{
int a = 0;
int b = 0;
//a,b记录两个加数,若栈空,取0
if(!sta1.empty()) a = sta1.top()->val;
if(!sta2.empty()) b = sta2.top()->val;
//相加之后存贮在链表长的链表中
if(size1 > size2)
{
sta1.top()->val = (a + b + c) % 10;
c = (a + b + c) / 10;
}
else if(size1 < size2)
{
sta2.top()->val = (a + b + c) % 10;
c = (a + b + c) / 10;
}
else
{
sta1.top()->val = (a + b + c) % 10;
sta2.top()->val = (a + b + c) % 10;
c = (a + b + c) / 10;
}
//不为空pop(),链表实际往前走
if(!sta1.empty()) sta1.pop();
if(!sta2.empty()) sta2.pop();
}
if(c>0)
{
head->val = c;
head->next = size1>size2?head1:head2;
return head;
}
else
{
return size1>size2?head1:head2;
}
}
};