LeetCode:Add Two Numbers
2014-03-24 00:05
239 查看
这题可以说是花了我很久的一道题,说实话感觉以前链表知识学得很好,但是实际动手起来就会发现其实自己有很多问题不懂。比如链表指针再动的时候,没有加另外再赋值一个头指针,不这样在单链表里就没办法找到原来的头指针。再比如,用pushBack方法压入数据是,链表的指针应该再移一位。作为一个大三的学生了,现在才会利用好链表觉得还是满惭愧的。
这道题我本来是想把l1和l2的数据先表示出来再求和,再把和存到链表里,发现和一旦很大以后就会出现莫名其妙的结果,看来用链表存储大数据是有道理的!
最近没有更新,是我弟弟来武汉看樱花了,据说今天来武大看樱花的人数过10万了,唉真心伤不起。每天看到学校人多暴了,都不太想出门了。
还是要好好学好数据结构和算法,最近越来越有这种感触了。
/**
* 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) {
if(l1==NULL)return l2;
if(l2==NULL)return l1;
int flag=0;//进位标志
int sum=0;
int current=0;
int quo=0;
int tmp;
ListNode *l3=NULL;
ListNode *ans=NULL;
while(l1!=NULL&&l2!=NULL){ //l1,l2链表均不为空
tmp=l1->val+l2->val+ flag;
flag=tmp/10;
current=tmp%10;
if(l3==NULL){ //l3为空时赋初值
l3=new ListNode(current);
ans=l3;
}
else{
l3=pushBack(l3,current); //不空,L3压入currenr,!!且l3指向下一节点!!
}
l1=l1->next;
l2=l2->next;
}
while(l1!=NULL){ //l2为空l1不为空
tmp=l1->val+ flag;
flag=tmp/10;
current=tmp%10;
l3=pushBack(l3,current);
l1=l1->next;
}
while(l2!=NULL){
tmp=l2->val+ flag;
flag=tmp/10;
current=tmp%10;
l3=pushBack(l3,current);
l2=l2->next;
}
if(l1==NULL&&l2==NULL&&flag==1) //若两者之和还有进位
l3=pushBack(l3,1);
return ans;
}
ListNode * pushBack(ListNode * last, int val) { //模拟C++的pushBack方法
ListNode * l = new ListNode(val);
last->next = l;
return l;
}
};
/*int main(){
ListNode *l2=new ListNode(1);
ListNode * l = new ListNode(9);
l2->next = l;
ListNode * l4 = new ListNode(9);
l->next = l4;
ListNode * l5 = new ListNode(9);
l4->next = l5;
ListNode * l6 = new ListNode(9);
l5->next = l6;
ListNode * l7 = new ListNode(9);
l6->next = l7;
ListNode * l8 = new ListNode(9);
l7->next = l8;
ListNode * l9 = new ListNode(9);
l8->next = l9;
ListNode * l20 = new ListNode(9);
l9->next = l20;
ListNode * l21 = new ListNode(9);
l20->next = l21;
ListNode * l22 = new ListNode(9);
l21->next = l22;
ListNode *l1=new ListNode(9);
Solution Test;
ListNode *l3=Test.addTwoNumbers(l1,l2);
while(l3!=NULL){
cout<<l3->val;
l3=l3->next;
}
return 0;
}*/
这道题我本来是想把l1和l2的数据先表示出来再求和,再把和存到链表里,发现和一旦很大以后就会出现莫名其妙的结果,看来用链表存储大数据是有道理的!
最近没有更新,是我弟弟来武汉看樱花了,据说今天来武大看樱花的人数过10万了,唉真心伤不起。每天看到学校人多暴了,都不太想出门了。
还是要好好学好数据结构和算法,最近越来越有这种感触了。
/**
* 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) {
if(l1==NULL)return l2;
if(l2==NULL)return l1;
int flag=0;//进位标志
int sum=0;
int current=0;
int quo=0;
int tmp;
ListNode *l3=NULL;
ListNode *ans=NULL;
while(l1!=NULL&&l2!=NULL){ //l1,l2链表均不为空
tmp=l1->val+l2->val+ flag;
flag=tmp/10;
current=tmp%10;
if(l3==NULL){ //l3为空时赋初值
l3=new ListNode(current);
ans=l3;
}
else{
l3=pushBack(l3,current); //不空,L3压入currenr,!!且l3指向下一节点!!
}
l1=l1->next;
l2=l2->next;
}
while(l1!=NULL){ //l2为空l1不为空
tmp=l1->val+ flag;
flag=tmp/10;
current=tmp%10;
l3=pushBack(l3,current);
l1=l1->next;
}
while(l2!=NULL){
tmp=l2->val+ flag;
flag=tmp/10;
current=tmp%10;
l3=pushBack(l3,current);
l2=l2->next;
}
if(l1==NULL&&l2==NULL&&flag==1) //若两者之和还有进位
l3=pushBack(l3,1);
return ans;
}
ListNode * pushBack(ListNode * last, int val) { //模拟C++的pushBack方法
ListNode * l = new ListNode(val);
last->next = l;
return l;
}
};
/*int main(){
ListNode *l2=new ListNode(1);
ListNode * l = new ListNode(9);
l2->next = l;
ListNode * l4 = new ListNode(9);
l->next = l4;
ListNode * l5 = new ListNode(9);
l4->next = l5;
ListNode * l6 = new ListNode(9);
l5->next = l6;
ListNode * l7 = new ListNode(9);
l6->next = l7;
ListNode * l8 = new ListNode(9);
l7->next = l8;
ListNode * l9 = new ListNode(9);
l8->next = l9;
ListNode * l20 = new ListNode(9);
l9->next = l20;
ListNode * l21 = new ListNode(9);
l20->next = l21;
ListNode * l22 = new ListNode(9);
l21->next = l22;
ListNode *l1=new ListNode(9);
Solution Test;
ListNode *l3=Test.addTwoNumbers(l1,l2);
while(l3!=NULL){
cout<<l3->val;
l3=l3->next;
}
return 0;
}*/
相关文章推荐
- 【LeetCode】Add Two Numbers
- leetcode Add Two Numbers
- LeetCode(2)--Add Two Numbers
- LeetCode 002 Add Two Numbers
- 【leetcode】 Add Two Numbers
- LeetCode 2.Add Two Numbers
- leetcode---add-two-numbers---链表
- LeetCode_Add Two Numbers
- leetcode2 Add Two Numbers
- leetcode 2. Add Two Numbers
- LeetCode 2 Add Two Numbers 模拟,读题 难度:0
- LeetCode 2:Add Two Numbers
- LeetCode 2. Add Two Numbers(单链表求和)
- 2. Add Two Numbers LeetCode
- LeetCode 2 Add Two Numbers
- LeetCode 作业题目:2. Add Two Numbers
- LeetCode Add Two Numbers
- LeetCode刷题(2)——AddTwoNumbers
- 【JAVA、C++】LeetCode 002 Add Two Numbers
- leetCode---Add Two Numbers