/**
* 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) {
int d = 0;
int a, b;
stack<int> s1, s2;
ListNode *p = l1, *q = l2;
// 设置一个带头结点的链表
ListNode * head = new ListNode();
// 都入栈
while(p){
s1.push(p->val);
p = p->next;
}
while(q){
s2.push(q->val);
q = q->next;
}
// 从栈中弹出来,相加
while(1){
if (s1.empty() && s2.empty()){
break;
}
// 先设置加项都为零
a = 0, b= 0;
// 如果栈非空,就把加项设置为应该是的数
if(!s1.empty()){
a = s1.top();
s1.pop();
}
if(!s2.empty()){
b = s2.top();
s2.pop();
}
// 将加项和上次的进位加起来
int m = a + b + d;
// 获取本次应该进位的数
d = m / 10;
// 计算本次位应该保留的小于10的那个数
int k = m % 10;
// 将本次计算的数插入链表,头插即可
ListNode * node = new ListNode(k);
node->next = head->next;
head->next = node;
}
// 最后需要最后一次加项相加后有没有进位,有进位的话,直接将进位插入链表
if(d){
ListNode *node = new ListNode(d);
node->next = head->next;
head->next = node;
}
return head->next;
}
};