给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
方法1:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
int carry = 0;
int sum = 0;
ListNode* newhead = new ListNode(0, NULL);
ListNode* nownode = newhead;
while(l1 || l2 || carry)
{
sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
carry = sum / 10;
ListNode* node = new ListNode(sum % 10, NULL);
nownode->next = node;
nownode = nownode->next;
l1 = l1?l1->next:l1;
l2 = l2?l2->next:l2;
}
ListNode *ret = newhead->next;
delete newhead;
return ret;
}
};
方法2:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
vector<int> v;
int carry = 0;
int sum = 0;
while (l1 || l2 || carry)
{
sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
carry = sum / 10;
v.push_back(sum % 10);
l1 = l1 ? l1->next : l1;
l2 = l2 ? l2->next : l2;
}
int len = v.size();
ListNode* ret = new ListNode[len], *temp = ret;
int i = 0;
for (; i < len - 1; i++)
{
ret[i].next = &ret[i + 1];
ret[i].val = v[i];
}
ret[i].val = v[i];
ret[i].next = NULL;
return ret;
}
};
但是由于leetcode后台delete结果链表时使用delete 这里不能修改,所以不通过,实际是没有问题的,一次性分配所需的内存,程序更优。