LeetCode刷题 2.两数相加

一、题目

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

二、初次的暴力解答(C)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) 

{
    struct ListNode* ret=(struct ListNode*)malloc(sizeof(struct ListNode));
    ret->next=NULL;
    int jinwei = 0;
    struct ListNode *p=l1->next;
    struct ListNode *q=l2->next;
    
    ret->val=(l1->val+l2->val)%10;
    jinwei=(int)(l1->val+l2->val)/10;
    struct ListNode* n=ret;
    while(p!=NULL && q!=NULL)
    {
        struct ListNode *ss=(struct ListNode*)malloc(sizeof(struct ListNode));
        ss->next=NULL;
        ss->val=(p->val+q->val+jinwei)%10;
        jinwei=(int)(p->val+q->val+jinwei)/10;
        n->next=ss;
        n=n->next;
        p=p->next;
        q=q->next;
    }
   
    if(p==NULL && q==NULL && jinwei==1)
    {
        struct ListNode *ss=(struct ListNode*)malloc(sizeof(struct ListNode));
        ss->next=NULL;
        ss->val=1;
        n->next=ss;
        n=n->next;
    }
    if(p!=NULL || q!=NULL)
    {
        if(p!=NULL)
        {
            if(jinwei == 1)
            {
                struct ListNode* p1=p;
       
                    while(p1->val==9 && p1!=NULL && p1->next!=NULL)
                    {
                        p1->val=0;
                        p1=p1->next;
                    }
                
                
                if(p1->val==9)
                {
                    p1->val=0;
                   struct ListNode *ss=(struct ListNode*)malloc(sizeof(struct ListNode));
                   ss->next=NULL;
                    ss->val=1;
                    p1->next=ss;
                }
                else
                {
                    p1->val++;
                }
            }
                n->next=p;
            
        }
        if(q!=NULL)
        {
            if(jinwei == 1)
            {
                struct ListNode* q1=q;
                    while(q1->val==9 && q1!=NULL && q1->next!=NULL)
                    {
                        q1->val=0;
                        q1=q1->next;
                   
                    }

                
                if(q1->val==9)
                {
                    q1->val=0;
                   struct ListNode *ss=(struct ListNode*)malloc(sizeof(struct ListNode));
                   ss->next=NULL;
                    ss->val=1;
                    q1->next=ss;
                }
                else
                {
                    q1->val++;
                }
            }
            
            n->next=q;
        }
    }
   
    return ret;
}

初次解答反思和总结:

1.一直有拆东墙补西墙的感觉,对于特殊情况考虑不周,没有很好的把握,在以后刷题中应多加注意留心!!切记。

2.在LeetCode刷题中声明结构体变量时在变量名前应加上struct。

3.一定要理清思路!!理清思路后再码代码,要不然会搞的代码一团糟。

二、别人家的代码

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    
    struct ListNode *p1=l1;
    struct ListNode *p2=l2;
    struct ListNode *result=(struct ListNode *)malloc(sizeof(struct ListNode));
    result->val=0;
 
    struct ListNode *p=NULL;
    int c=0;
    while (p1!=NULL || p2!=NULL || c!=0)
    {
        if(p == NULL)
        {
            p=result;
        }
        else
        {
            p->next=(struct ListNode*)malloc(sizeof(struct ListNode)); //这里写成p会出错
            p->next->val=0;
            p=p->next;
        }
        int a=(p1==NULL ? 0:p1->val);
        int b=(p2==NULL ? 0:p2->val);
        int s=(a+b+c)%10;
        c=(a+b+c)/10;
        p->val=s;     
        p->next=NULL;
   
        p1=(p1==NULL ? NULL : p1->next);
        p2=(p2==NULL ? NULL : p2->next);
 
    }
    return result;
} 

别人家的代码总结:

思路清晰,简单易懂。多家学习,看看别人的代码,真是没脸见人了。

猜你喜欢

转载自blog.csdn.net/qq_33181035/article/details/82977060
今日推荐