https://leetcode.com/problems/add-two-numbers/
题意:两个链表表示两个数 ,
2 4 3
5 6 4
按照加法的规则从左往右加以及 进位。
输出:和的链表。
仍然是水题。一些特殊情况需要考虑(这些做题的时候我考虑到了)
1、如果两个长度不等,如l1>l2 ,那么需要l1比l2多出来的部分加上进位copy到ans里
2、5+5的情况,虽然长度相等,但是最高位进位了
可惜,WA了两发,因为
正确的应该是
int v = l1->val + l2->val +add; ans -> val = v%10;我写成
int v = l1->val + l2->val; ans -> val = v%10+add;
下面是测试程序
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode * a=NULL, * b=NULL;
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int add = 0;
ListNode* ans = 0;
ListNode* ret=0;
int f = 0;
if(l1||l2)ans = new ListNode(0);
while(l1 && l2){
int v = l1->val + l2->val +add;
//cout <<"DEBUG" << l1->val << " " << l2->val << endl;
if(f == 0){
ret = ans;
f++;
ans -> val = v%10;
}else{
ans -> next = new ListNode(0);
ans = ans ->next;
ans -> val = v%10;
ans ->next = 0;
}
add = v/10;
l1 = l1->next;
l2 = l2->next;
}
//最后需要处理Add
if(l1 || l2){
ListNode* remain = l1 ? l1 : l2;
while(remain){
//cout <<"DEBUG" << remain->val << endl;
int v = remain->val+add;// + l2->val;
ans->next = new ListNode(v%10);
add = v/10;
ans = ans->next;
ans->next = NULL;
remain = remain->next;
}
}
if(add){
ans->next = new ListNode(add);
ans->next->next = 0;
}
return ret;
}
};
int main(){
//freopen("in.txt","r",stdin);
string str1, str2;
cin >> str1 >> str2;
ListNode *sta=NULL, *stb=NULL;
if(str1.size())sta = a = new ListNode(0);
for(int i=0;i<str1.size();i++){
a->val = str1[i]-'0';
a->next = (i==str1.size()-1)?NULL:new ListNode(0);
a = a->next;
}
if(str2.size())stb = b = new ListNode(0);
for(int i=0;i<str2.size();i++){
b->val = str2[i]-'0';
b->next = (i == str2.size()-1)?NULL:new ListNode(0);
b = b->next;
}
ListNode* ans = ((new Solution())->addTwoNumbers(sta,stb));
//ListNode* ans = NULL;
while(ans){
cout << ans->val << endl;
ans = ans -> next;
}
return 0;
}
LeetCode OJ #2 Add Two Numbers
原文:http://blog.csdn.net/u011026968/article/details/45442283