链表的两数之和问题的的


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode *head=NULL,*p,*last;
    int a=0;
    while(l1&&l2){
        p=(struct ListNode*)malloc(sizeof(struct ListNode));
        a=(l1->val+l2->val+a)%10;//a是进位
        p->val=a;
        p->next=NULL;
        a=(l1->val+l2->val+a)/10;
        if(head==NULL){
            head=p;
            last=head;
        }
        else{
            last->next=p;
            last=p;
        }
        l1=l1->next;
        l2=l2->next;
    }
    int b=0;
    if(!l1&&l2){
        while(l2){
            p=(struct ListNode*)malloc(sizeof(struct ListNode));
            if(a>0){
                b=(l2->val+a+b)%10;
                p->val=a;
                p->next=NULL;
                last->next=p;
                last=p;
                b=(l2->val+a+b)/10;
                a=0;
            }
            else{
                p->val=l2->val;
                p->next=NULL;
                last->next=p;
                last=p;
            }
            l2=l2->next;
        }
        if(b>0){
            p=(struct ListNode*)malloc(sizeof(struct ListNode));
            p->val=b;
            p->next=NULL;
            last->next=p;
            last=p;
        }
    }
    if(!l2&&l1){
        while(l1){
            p=(struct ListNode*)malloc(sizeof(struct ListNode));
            if(a>0){
                b=(l1->val+a+b)%10;
                p->val=a;
                p->next=NULL;
                last->next=p;
                last=p;
                b=(l1->val+a+b)/10;
                a=0;
            }
            else{
                p->val=l1->val;
                p->next=NULL;
                last->next=p;
                last=p;
            }
            l1=l1->next;
        }
        if(b>0){
            p=(struct ListNode*)malloc(sizeof(struct ListNode));
            p->val=b;
            p->next=NULL;
            last->next=p;
            last=p;
        }
    }
    if(!l1&&!l2){
        if(a>0){
            p=(struct ListNode*)malloc(sizeof(struct ListNode));
            p->val=a;
            p->next=NULL;
            last->next=p;
            last=p;
        }
    }
    return head;
}

两数之和问题那出错了呢,看半天没发现问题

img

a=(l1->val+l2->val+a)%10;//a是进位
注释和代码不一致啊。除以10才是进位

修改如下,改动处见注释,供参考:

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode *head=NULL,*p,*last;
    int a=0;
    while(l1&&l2){
        p=(struct ListNode*)malloc(sizeof(struct ListNode));
        a = l1->val+l2->val+a;  // a=(l1->val+l2->val+a)%10;  修改
        p->val = a % 10;        // p->val=a;                  修改
        p->next=NULL;
        a /= 10;        // a=(l1->val+l2->val+a)/10; a是进位  修改
        if(head==NULL){
            head=p;
            last=head;
        }
        else{
            last->next=p;
            last=p;
        }
        l1=l1->next;
        l2=l2->next;
    }
    //int b=0;  修改
    if(!l1&&l2){
        while(l2){
            p=(struct ListNode*)malloc(sizeof(struct ListNode));
            //if(a>0){
            a = l2->val+a;  // b=(l2->val+a+b)%10; 修改
            p->val = a % 10;// p->val=a;           修改
            p->next=NULL;
            last->next=p;
            last=p;
            a /= 10; //b=(l2->val+a+b)/10;         修改
                     //a=0;
                     //}
                     //else{
                     //p->val=l2->val;
                     //p->next=NULL;
                     //last->next=p;
                     //last=p;
                     //}
            l2=l2->next;
        }
            //if(b>0){                             修改
            //p=(struct ListNode*)malloc(sizeof(struct ListNode));
            //p->val=b;
            //p->next=NULL;
            //last->next=p;
            //last=p;
            //}
    }
    if(!l2&&l1){
        while(l1){
            p=(struct ListNode*)malloc(sizeof(struct ListNode));
                //if(a>0){                        修改
            a = l1->val+a;//b=(l1->val+a+b)%10;   修改
            p->val = a % 10; //p->val=a;          修改
            p->next=NULL;
            last->next=p;
            last=p;
            a /= 10;//b=(l1->val+a+b)/10;         修改
                    //a=0;
                    //}
                    //else{
                    //p->val=l1->val;
                    //p->next=NULL;
                    //last->next=p;
                    //last=p;
                    //}
            l1=l1->next;
        }
            //if(b>0){                            修改
            //p=(struct ListNode*)malloc(sizeof(struct ListNode));
            //p->val=b;
            //p->next=NULL;
            //last->next=p;
            //last=p;
            //}
    }
        //if(!l1&&!l2){                          修改
    if(a>0){
        p=(struct ListNode*)malloc(sizeof(struct ListNode));
        p->val=a;
        p->next=NULL;
        last->next=p;
        last=p;
    }
        //}                                      修改
    return head;
}