方法一:不采用额外空间
时间复杂度:O(n)
空间复杂度:O(1)
class Solution
{
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
int n = 0;
ListNode* pl1 = l1;
ListNode* pl2 = l2;
for (int temp = 0;
pl1 != nullptr && pl2 != nullptr;
pl1 = pl1->next, pl2 = pl2->next)
{
temp = pl1->val + pl2->val + n;
if (temp >= 10)
{
n = 1;
}
else
{
n = 0;
}
temp %= 10;
pl1->val = temp;
pl2->val = temp;
}
if (pl1 == nullptr && pl2 != nullptr)
{
for (int temp = 0;
pl2->next != nullptr;
pl2 = pl2->next)
{
temp = pl2->val + n;
if (temp >= 10)
{
n = 1;
}
else
{
n = 0;
}
temp %= 10;
pl2->val = temp;
}
int temp = pl2->val + n;
if (temp >= 10)
{
n = 1;
}
else
{
n = 0;
}
temp %= 10;
pl2->val = temp;
if (n!=0)
{
ListNode* newNode = new ListNode(1);
pl2->next = newNode;
}
return l2;
}
else if (pl1 != nullptr && pl2 == nullptr)
{
for (int temp = 0;
pl1->next != nullptr;
pl1 = pl1->next)
{
temp = pl1->val + n;
if (temp >= 10)
{
n = 1;
}
else
{
n = 0;
}
temp %= 10;
pl1->val = temp;
}
int temp = pl1->val + n;
if (temp >= 10)
{
n = 1;
}
else
{
n = 0;
}
temp %= 10;
pl1->val = temp;
if (n != 0)
{
ListNode* newNode = new ListNode(1);
pl1->next = newNode;
}
return l1;
}
if (n != 0)
{
ListNode* pl1 = l1;
while (pl1->next!=nullptr)
{
pl1 = pl1->next;
}
ListNode* newNode = new ListNode(1);
pl1->next = newNode;
}
return l1;
}
};
方法二:采用额外空间
时间复杂度:O(n)
空间复杂度:O(1)
class Solution
{
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
int n = 0;
ListNode* ret = new ListNode(-1); //定义一个虚拟头节点
ListNode* curr = ret; //有两个好处:1,第一次插入时方便 2,最后如果要增加一位元素,会方便一些
while (l1 != nullptr || l2 != nullptr)
{
int n1 = (l1 != nullptr) ? l1->val : 0; //高位补零
int n2 = (l2 != nullptr) ? l2->val : 0;
int temp = n1 + n2 + n;
if (temp >= 10)
{
n = 1;
}
else
{
n = 0;
}
temp %= 10;
ListNode* newNode = new ListNode(temp);
curr->next = newNode;
curr = curr->next;
l1 = (l1 == nullptr) ? nullptr : l1->next;
l2 = (l2 == nullptr) ? nullptr : l2->next;
}
if (n != 0) //说明还需要进位
{
ListNode* newNode = new ListNode(1);
curr->next = newNode;
}
return ret->next;
}
};