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;
真尼玛二笔。。。另外数据结构确实不熟了,得写一写STL源码剖析了。。。
下面是测试程序
#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; }
时间: 2024-10-13 08:22:45