2.两数相加-力扣(PS:两个小时才通过全部测试,第一种方法通过99%的测试用例)

这道题目虽然看着难度不大,但是我写了两个多小时才通过测试!PS:不经常刷算法,手会生的。
题目描述:

下面是我的翻车之作,编译数次后发现问题。

/** 6. Definition for singly-linked list. 7. struct ListNode { 8. int val; 9. struct ListNode *next; 10. }; */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode *temp,*p,*rear;
    struct ListNode *result,*ptr;
    result=(struct ListNode *)malloc(sizeof(struct ListNode));
    result->next=NULL;//初始化头节点指向的下一个地址为NULL
    rear=result;//未创建其他节点之前,只有一个头节点
    long int sum=0,t=1;
    //p=result;
    while(l1)
    {
        sum+=l1->val*t;
        t*=10;
        l1=l1->next;
    }
    t=1;
    while(l2)
    {
        sum+=l2->val*t;
        t*=10;
        l2=l2->next;
    }
    if(sum==0){
        result->val=0;
        return result;
    }
    while(sum>0)
    {
        temp=(struct ListNode*)malloc(sizeof(struct ListNode));
        //temp->next=NULL;
        temp->val=sum%10;
        sum=sum/10;
        rear->next=temp;
        rear=temp;
    }
    rear->next=NULL;
    ptr=result;
    result=ptr->next;
    return result;
}

此代码是用另一种思路来实现:首先将两个链表的数值相加得到总和,然后再利用尾插法将总和以链表的形式存储。
遇到的问题:
1. 忘记尾插法。
2. 得到新的链表后发现多了一个头指针。
3. 以上全部解决完后,发现当两个链表全为空时不行。
4. 最后发现,当数特别大时用long int也没法计算。
以上代码适用于80%以上的测试用例。

100%测试用例 题目代码:

/** 1. Definition for singly-linked list. 2. struct ListNode { 3. int val; 4. struct ListNode *next; 5. }; */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode *new1,*p3;
    struct ListNode *result;
    result=(struct ListNode *)malloc(sizeof(struct ListNode));
    result->next=NULL;//这里很重要,定义了指针以后,要把它的next赋成NULL,否则会编译出错
    int sum=0;
    p3=result;
    while(1)
    {
        if(l1)
        {
            sum+=l1->val;
            l1=l1->next;
        }
        if(l2)
        {
            sum+=l2->val;
            l2=l2->next;
        }
        p3->val=sum%10;
        sum=sum/10;
        if(l1 || l2 || sum!=0)//当l1不为空或l2不为空或sum不为0时,循环继续
        {
            new1=(struct ListNode *)malloc(sizeof(struct ListNode));
            new1->next=NULL;//这里很重要,定义了指针以后,要把它的next赋成NULL,否则会编译出错
            p3->next=new1;
            p3=p3->next;
            }
        else break;//否则跳出循环得到结果
    }
        return result;
}
全部评论

相关推荐

已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务