- 题目:
给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7
- 解题思路
1:反转链表,就变成了反转链表1的解法 :
代码实现(C++)
ListNode* rev(ListNode* head) //反转链表
{
if(head == nullptr || head->next == nullptr)
return head;
ListNode* newhead = rev(head->next);
head->next->next = head;
head->next = nullptr;
return newhead;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* newhead1 = rev(l1); //反转链表l1
ListNode* newhead2 = rev(l2); //反转链表l2
int tag = 0; //进位标志
ListNode *p = newhead1->next, *q = newhead2->next;
// cout << p->val;
//cout << q->val;
ListNode *newhead3 = new ListNode(0);
newhead3->val = (newhead1->val + newhead2->val) % 10;
tag = (newhead1->val + newhead2->val) / 10;
ListNode *L = newhead3;
while(p != nullptr && q != nullptr)
{
ListNode *newNode = new ListNode(0);
L->next = newNode;
newNode->val = (p->val + q->val + tag) % 10;
tag = (p->val + q->val + tag) / 10;
p = p->next;
q = q->next;
L = newNode;
}
while(p)
{
ListNode* l3 = new ListNode(0);
L->next = l3;
L = l3;
if (p->val + tag < 10)
{
L->val = p->val + tag;
tag = 0;
}
else
{
L->val = 0;
tag = 1;
}
p = p->next;
}
while(q)
{
ListNode* l3 = new ListNode(0);
L->next = l3;
L = l3;
if (q->val + tag < 10)
{
L->val = q->val + tag;
tag = 0;
}
else
{
L->val = 0;
tag = 1;
}
q = q->next;
}
if(tag != 0)
{
ListNode *L4 = new ListNode(0);
L4->val = 1;
L->next = L4;
tag = 0;
}
ListNode* newhead4 = rev(newhead3);
return newhead4;
}
2:可以利用栈来进行链表反转,而不用修改链表