题目:
给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 输出: 7 -> 8 -> 0 -> 7
思路:
这是一个简单的两数相加问题,然而,每一位数字变成用链表链接起来增加了一定难度。
做加法很容易想到进位问题,例如999+1,很容易变成多层进位,那么就不能直直的从第一个开始,而是从最后一位开始。
由此,我们可以联想到栈。
首先将两链表分别推入栈中,然后逐个退出,相加,进位。最后验证有没有进新的一位即可。
程序:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
stack<ListNode*> s1,s2;
ListNode *bak;
bak=l1;
while(bak!=NULL) {
s1.push(bak);
bak=bak->next;
}
bak=l2;
while(bak!=NULL) {
s2.push(bak);
bak=bak->next;
}
ListNode *head;
head = NULL;
int c = 0;
while (!s1.empty() || !s2.empty() || c != 0) {
int a = (s1.empty()==false) ? (*(s1.top())).val : 0;
int b = (s2.empty()==false) ? (*(s2.top())).val : 0;
int sum=a+b+c;
if(!s1.empty())
s1.pop();
if(!s2.empty())
s2.pop();
c = sum/10;
sum = sum%10;
ListNode *node = new ListNode(sum);
if(head == NULL)
head = node;
else {
bak = head;
head = node;
head->next = bak;
}
}
return head;
/* stack<int> stk1,stk2;
ListNode *res = new ListNode(0);
ListNode *cur = res;
while (l1){
stk1.push(l1->val);
l1 = l1->next;
}
while (l2){
stk2.push(l2->val);
l2 = l2->next;
}
int cf = 0,num = 0;
while (stk1.size() || stk2.size()){
if (stk1.size()){
num += stk1.top();
stk1.pop();
}
if (stk2.size()){
num += stk2.top();
stk2.pop();
}
ListNode *tmp = new ListNode(num%10);
num = num/10;
tmp->next = cur->next;
cur->next = tmp;
}
if (num > 0){
ListNode *tmp = new ListNode(1);
tmp->next = cur->next;
cur->next = tmp;
}
return res->next;*/
}
};