1 题目
You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.
Example:
Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 8 -> 0 -> 7
2 尝试解
2.1 分析
给定两个用链表表示的整数,分别代表由高到低每一位上的数字,求和并以同样的链表格式输出。
可以用两个栈分别存储每一位的数字,就等同于字符串加减法。
2.2 代码
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
stack<int> saver_l1;
stack<int> saver_l2;
while(l1){
saver_l1.push(l1->val);
l1 = l1->next;
}
while(l2){
saver_l2.push(l2->val);
l2 = l2->next;
}
int cur = 0;
ListNode* last = NULL;
while(!saver_l1.empty()||!saver_l2.empty()||cur){
if(!saver_l1.empty()){
cur += saver_l1.top();
saver_l1.pop();
}
if(!saver_l2.empty()){
cur += saver_l2.top();
saver_l2.pop();
}
ListNode* temp = new ListNode(cur%10);
temp->next = last;
last = temp;
cur = cur / 10;
}
return last;
}
};
3 标准解
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int n1 = 0, n2 = 0, carry = 0;
ListNode *curr1 = l1, *curr2 = l2, *res = NULL;
while( curr1 ){ curr1=curr1->next; n1++; }
while( curr2 ){ curr2=curr2->next; n2++; }
curr1 = l1; curr2 = l2;
while( n1 > 0 && n2 > 0){
int sum = 0;
if( n1 >= n2 ){ sum += curr1->val; curr1=curr1->next; n1--;}
if( n2 > n1 ){ sum += curr2->val; curr2=curr2->next; n2--;}
res = addToFront( sum, res );
}
curr1 = res; res = NULL;
while( curr1 ){
curr1->val += carry; carry = curr1->val/10;
res = addToFront( curr1->val%10, res );
curr2 = curr1;
curr1 = curr1->next;
delete curr2;
}
if( carry ) res = addToFront( 1, res );
return res;
}
ListNode* addToFront( int val, ListNode* head ){
ListNode* temp = new ListNode(val);
temp->next = head;
return temp;
}