LeetCode #2 两数相加

本文分享了作者在解决LeetCode #2 两数相加问题上的经验,包括失败尝试和成功解法。初次尝试时,由于未正确处理进位导致部分测试用例失败。在修正后,通过将进位判断置于循环结束条件,成功解决了问题。提供的代码在测试用例中表现出色。
摘要由CSDN通过智能技术生成

LeetCode #2 两数相加

本文章是对LeetCode #2 两数相加的经验总结。

题目如下:

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例:

输入:[2,4,3] [5,6,4]
输出:[7,0,8]
原因:342 + 465 = 807

第一次 失败的尝试

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode LinkList;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    int tmp, carry, l1val = l1->val, l2val = l2->val;
    LinkList *p, *pre, *l3 = NULL;
    while (1)
    {
        p = (LinkList*)malloc(sizeof(LinkList));
        if (l3 == NULL)
        {
            l3 = p;
            pre = p;
        }
        else
        {
            pre->next = p;
            pre = pre->next;
        }
        
        pre->next = NULL;
        tmp = l1val + l2val + carry;
        
        if(tmp > 9)
        {
            carry = tmp;
            tmp = tmp % 10;
            carry = (carry - tmp) / 10;
        }
        
        pre->val = tmp;
        
        if (l1->next == NULL && l2->next == NULL)
            break;
        
        if (l1->next != NULL)
        {
            l1val = l1->next->val;
            l1 = l1->next;
        }
        else
            l1val = 0;
        
        if (l2->next != NULL)
        {
            l2val = l2->next->val;
            l2 = l2->next;
        }
        else
            l2val = 0;
    }
    return l3;
}

题目输入两个单链表:l1l2,我的思路是从头开始逐项相加,如果得到的和是两位数,则将进位放入carry中。
这次尝试的问题是:我设置了进位,但在判定逐项相加是否结束(即两个链表的下一项是否都为空)的时候直接退出循环,而没有把进位再放上去,导致某些测试用例的输出缺少了最后一位。

第二次 成功

发觉上面提到的问题后,我把判定移到了检查进位carry是否为0之后:如果,则判断;如果不是,则跳过判断。

下面是代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode LinkList;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    int tmp, carry = 0, l1val = l1->val, l2val = l2->val;
    LinkList *p, *pre, *l3 = NULL;
    while (1)
    {
        p = (LinkList*)malloc(sizeof(LinkList));
        if (l3 == NULL)
        {
            l3 = p;
            pre = p;
        }
        else
        {
            pre->next = p;
            pre = pre->next;
        }
        
        pre->next = NULL;
        tmp = l1val + l2val + carry;
        carry = 0;
        if(tmp > 9)
        {
            carry = tmp;
            tmp = tmp % 10;
            carry = (carry - tmp) / 10;
        }
        
        pre->val = tmp;
        
        if (carry == 0)
            if (l1->next == NULL && l2->next == NULL)
                break;
        
        if (l1->next != NULL)
        {
            l1val = l1->next->val;
            l1 = l1->next;
        }
        else
            l1val = 0;
        
        if (l2->next != NULL)
        {
            l2val = l2->next->val;
            l2 = l2->next;
        }
        else
            l2val = 0;
    }
    return l3;
}

这次的代码跑到了28ms,第二快,但是第二快的代码是最多的。

提供一些测试用例:

  • [9,8,9,8,7,8,9,9,5,4,9,9,8,8]
  • [9,7,5,8,6,3,4,1,5,8,6,6]
  • [0]
  • [0]
  • [5]
  • [5]
  • [0,1]
  • [0,9]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值