Leetcode刷题笔记2:Add Two Numbers(C语言)

错误示范:

开始的时候,我想的比较简单,就输入的时候直接倒转得到数n1,同理得n2,

然后相加得n后,取余尾插法就逆转数字了,如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    long int n1=0,n2=0,n=0;
    int count=0,r=0;
    struct ListNode *l,*p,*q;
    while(l1!=NULL)
    {
        n1=(l1->val)*pow(10,count)+n1;
        count++;
        l1=l1->next;
    }//l1是243,n1是342
    count=0;
    while(l2!=NULL)
    {
        n2=(l2->val)*pow(10,count)+n2;
        count++;
        l2=l2->next;
    }
    n=n1+n2;//n=807
    q=(struct ListNode*)malloc(sizeof(struct ListNode));
    r=n%10;n=n/10;
    q->val=r;
    l=q;
    p=q;
    while(n>0)
    {
        q=(struct ListNode*)malloc(sizeof(struct ListNode));
        r=n%10;n=n/10;
        q->val=r;
        p->next=q;
        p=q;
    }
    p->next=NULL;
    return l;//l=708
}

调试也OK了,调试的时候报错:

点进去看了一下:

好吧= = 原来输入的数字这么长……long int 也存不下,那只能链表里直接相加了,后来想想其实直接相加更方便。

正确如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    int flag=0,n=0;//n记录当前位两个数相加,flag表示进位
    struct ListNode *head,*p,*q;
    q=(struct ListNode*)malloc(sizeof(struct ListNode));
    n=l1->val+l2->val;
    if(n>=10)
    {
        flag=1;n=n%10;
    }
    q->val=n;
    head=q;p=q;
    l1=l1->next;l2=l2->next;
    while(l1!=NULL&&l2!=NULL)
    {
        q=(struct ListNode*)malloc(sizeof(struct ListNode));
        if(flag==1)
        {
            n=l1->val+l2->val+flag;flag=0;
        }
        else
        {
            n=l1->val+l2->val;
        }
        if(n>=10)
        {
            flag=1;n=n%10;
        }
        q->val=n;
        p->next=q;
        p=q;
        l1=l1->next;
        l2=l2->next;
    }
    while(l1!=NULL&&l2==NULL)
    {
        q=(struct ListNode*)malloc(sizeof(struct ListNode));
        if(flag==1)
        {
            n=l1->val+flag;flag=0;
        }
        else
        {
            n=l1->val;
        }
        if(n>=10)
        {
            flag=1;n=n%10;
        }
        q->val=n;
        p->next=q;
        p=q;
        l1=l1->next;
    }
    while(l2!=NULL&&l1==NULL)
    {
        q=(struct ListNode*)malloc(sizeof(struct ListNode));
        if(flag==1)
        {
            n=l2->val+flag;flag=0;
        }
        else
        {
            n=l2->val;
        }
        if(n>=10)
        {
            flag=1;n=n%10;
        }
        q->val=n;
        p->next=q;
        p=q;
        l2=l2->next;
    }
    if(l1==NULL&&l2==NULL&&flag==1)
    {
        q=(struct ListNode*)malloc(sizeof(struct ListNode));
        q->val=1;
        p->next=q;
        p=q;
        flag=0;
    }    
    p->next=NULL;
    return head;
}

于是通过了~~

优化:

不过后来仔细琢磨了 一下:

因为每次都需要判断 

if(flag==1)  //就是有没有进位,有是1,没有是0

然后在同位相加的时候还要都为下一次提供判断,是否有进位

if(n>=10)

其实可以直接每次用这两句,而不用再循环:

n=(l1->val+l2->val+flag)%10;

flag=(1->val+l2->val+flag)/10;

猜你喜欢

转载自blog.csdn.net/weixin_41036461/article/details/88990837