两数相加
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order 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.
Example:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807.
简单算法:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
ListNode *key=NULL,*p,*q,*t;
int x,y,cin=0;sum;
p=l1;
q=l2;
while(p->next!=NULL||q->next!=null){
x=p!=NULL?p->val:0;
y=q!=NULL?q->val:0;
if(!key){
key=t=(ListNode*)malloc(sizeof(ListNode));
}else{
t=t->next=(ListNode*)malloc(sizeof(ListNode));
}
t->next=NULL;
t->val=(cin+x+y)%10;
cin=x+y+cin>9?1:0;
if(p)
p=p->next;
if(q)
q=q->next;
}
if(cin==1)
{
t=t->next=(ListNode*)malloc(sizeof(ListNode));
t->next=NULL;
t->val=1;
}
return key;
}
}
我的算法:
struct ListNode* ans[100];
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* p1=l1;
struct ListNode* p2=l2;
int sum=0,cin=0,i=0;
while(p1&&p2){
sum=p1->val+p2->val+cin;
if(sum<10){
ans[i]=(struct ListNode*)malloc(sizeof(struct ListNode));
ans[i]->next=NULL;
ans[i]->val=sum;
cin=0;
}
else{
ans[i]=(struct ListNode*)malloc(sizeof(struct ListNode));
ans[i]->next=NULL;
ans[i]->val=sum%10;
cin=1;
}
p1=p1->next;
p2=p2->next;
i++;
}
while(p1){
sum=p1->val+cin;
if(sum<10){
ans[i]=(struct ListNode*)malloc(sizeof(struct ListNode));
ans[i]->next=NULL;
ans[i]->val=sum;
cin=0;
}
else{
ans[i]=(struct ListNode*)malloc(sizeof(struct ListNode));
ans[i]->next=NULL;
ans[i]->val=sum%10;
cin=1;
}
p1=p1->next;
i++;
}
while(p2){
sum=p2->val+cin;
if(sum<10){
ans[i]=(struct ListNode*)malloc(sizeof(struct ListNode));
ans[i]->next=NULL;
ans[i]->val=sum;
cin=0;
}
else{
ans[i]=(struct ListNode*)malloc(sizeof(struct ListNode));
ans[i]->next=NULL;
ans[i]->val=sum%10;
cin=1;
}
p2=p2->next;
i++;
}
if(cin==1){
ans[i]=(struct ListNode*)malloc(sizeof(struct ListNode));
ans[i]->next=NULL;
ans[i]->val=1;
i++;
}
int j;
for(j=0;j<i-1;j++){
ans[j]->next=ans[j+1];
}
return ans[0];
}
int main()
{
struct ListNode* l1=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* l11=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* l12=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* l2=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* l21=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* l22=(struct ListNode*)malloc(sizeof(struct ListNode));
l1->val=4;
l1->next=l11;
l11->val=2;
l11->next=l12;
l12->val=3;
l12->next=NULL;
l2->val=1;
l2->next=l21;
l21->val=2;
l21->next=l22;
l22->val=5;
l22->next=NULL;
struct ListNode *p1=l1;
while(p1){
printf("%d->",p1->val);
p1=p1->next;
}
printf("\n");
struct ListNode *p=addTwoNumbers(l1,l2);
while(p!=NULL){
printf("%d->",p->val);
p=p->next;
}
return 0;
}