LeetCode刷题记录2-两数相加

题目

给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
一次循环搞定 时间O(n + m),空间O(1)
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    if (l1 == nullptr || l2 == nullptr)
    {
        return nullptr;
    }
    l1 = l1->next;
    l2 = l2->next;

    int carryNum = 0;   //进位
    ListNode* l3 = new ListNode(0);
    ListNode* p = l3;
    while (l1 || l2)
    {
        int val = 0;
        if (l1){
            val += l1->val;
        }
        if (l2){
            val += l2->val;
        }
        ListNode* node = nullptr;
        if (val % 10 + carryNum == 10)
        {
            node = new ListNode(0);
        }
        else
        {
            node = new ListNode(val % 10 + carryNum);
        }
        
        p->next = node;
        p = p->next;
        carryNum = (val + carryNum) / 10;
        if (l1) {
            l1 = l1->next;
        }
        if (l2) {
            l2 = l2->next;
        }
    }
    if (carryNum)
    {
        ListNode* node = new ListNode(carryNum);
        p->next = node;
        p = p->next;
    }
    return l3->next; //由于是头节点是哨兵所以返回头结点之后的数据(头的内存没有释放^_^)
}

void init(ListNode** l1, vector<int> arr)
{
    *l1 = new ListNode(0);
    ListNode* p = *l1;
    for (int val : arr)
    {
        ListNode* node = new ListNode(val);
        p->next = node;
        p = p->next;
    }
}

int main()
{
    ListNode* l1 = nullptr;
    ListNode* l2 = nullptr;
    init(&l1, { 2,4,3});
    init(&l2, {5,6,4});
    ListNode* l3 = addTwoNumbers(l1, l2);
    getchar();
    return 0;
}

LeetCode运行结果如下:
在这里插入图片描述

简洁版本

上面我的算法版本稍微有些冗余,参考LeetCode大神的解法,稍微简化了一些:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    if (l1 == nullptr || l2 == nullptr)
    {
        return nullptr;
    }
    l1 = l1->next;
    l2 = l2->next;

    int sum = 0;
    ListNode* l3 = new ListNode(0);
    ListNode* p = l3;
    while (l1 || l2)
    {
        if (l1){
            sum += l1->val;
            l1 = l1->next;
        }
        if (l2){
            sum += l2->val;
            l2 = l2->next;
        }
        ListNode* node = new ListNode(sum % 10);;
        sum /= 10;

        p->next = node;
        p = p->next;
    }
    if (sum)
    {
        ListNode* node = new ListNode(sum);
        p->next = node;
        p = p->next;
    }
    return l3->next;
}
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值