当前位置: 首页 > article >正文

【每日一题】Leetcode每日一题 - 两数相加

题目链接:https://leetcode.cn/problems/add-two-numbers/description

文章目录

  • 错误做法
  • 正确做法

错误做法

由于这题给到的链表顺序相对数字顺序来说是倒序的,我最初的想法是先把这个链表反转,然后遍历每一项的链表,使前面的计算结果 * 10 + 当前的值。

结果测试点里面有一个100000000000000000000000001这样的数据,所以就GG了,这是我原本的题解:

class Solution
{
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
    {
        // 首先实现反转列表
        ListNode *res1 = nullptr, *res2 = nullptr;
        ListNode *temp = l1, *temp2 = l2;
        // 如果temp不等于空
        while (temp != nullptr)
        {
            // 取出它的下一项,这么做的主要原因是取出下一项后最后一步temp需要重新指向下一项,temp的当前向的next会被我们指向res1
            ListNode* nextTemp = temp->next;
            // 将当前的下一项做为res1
            temp->next = res1;
            // 将temp整理好的顺序重新返还给res1
            res1 = temp;
            // 下次循环使用下一项进行循环
            temp = nextTemp;
        }

        while (temp2 != nullptr)
        {
            ListNode* nextTemp = temp2->next;
            temp2->next = res2;
            res2 = temp2;
            temp2 = nextTemp;
        }

        long long a = 0;
        long long b = 0;
        while (res1 != nullptr)
        {
            a = a * 10L + res1->val;
            res1 = res1->next;
        }

        while (res2 != nullptr)
        {
            b = b* 10L + res2->val ;
            res2 = res2->next;
        }
        long long c = a + b;

        if (c == 0)
        {
            return new ListNode(0);
        }

        ListNode* res = nullptr;
        ListNode* tail = nullptr;

        while (c != 0)
        {
            int m = c % 10;
            c = c / 10;
            // 创建一个新node
            ListNode* newNode = new ListNode(m);
            if (res == nullptr)
            {
                res = newNode;
                tail = res;
            }
            else
            {
                tail->next = newNode;
                tail = newNode;
            }
        }
        return res;
    }
};

正确做法

我的正确做法是参考了官方的题解了,因为我当时被这链表的顺序给折磨疯了就参考了一下题解才发现,给你倒序的原因就是你能够正好的计算每一位相加的结果,如果>=10了,再下一次计算加法的时候进位就好了。

但是我写完之后发现有一个9999999和9999的测试点又卡住了,经过梳理才发现原因是如果最后一位还有一个1没法再进位(就是加法算到头了)多余的一个进位肯定要写1,改了之后就过了

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* res = nullptr, *tail = nullptr;
        int carry = 0;
        while(l1 || l2) {
            int a = l1 ? l1->val : 0;
            int b = l2 ? l2->val : 0;
            int c = a + b + carry;
            carry = c >= 10 ? 1 : 0;
            ListNode* t = new ListNode(c % 10);
            if(res == nullptr) tail = res = t;
            else tail = tail->next = t;
            if(l1) l1 = l1->next;
            if(l2) l2 = l2->next;
        }
        if (carry == 1) tail = tail->next = new ListNode(1);
        return res;
    }
};

http://www.kler.cn/news/353254.html

相关文章:

  • python将1格式化为01
  • CODESYS随机动态图案验证码制作详细案例(三)
  • 江苏省医疗损害鉴定管理办法
  • R语言笔记(一)
  • js实现数组中数据有则删除无则添加-[‘12123‘,‘432233‘...]
  • 持续优化之路:Envoia许可证管理的轻松进阶
  • Chrome DevTools 一:简介 Console (入门必看)
  • nn.Conv2d(二)
  • 【Vue.js设计与实现】阅读笔记目录(持续更新)
  • 使用scss生成旋转圆圈
  • Python 面向对象编程 (OOP) 深入解析
  • windows10系统-使用自定义字体
  • SPSS 分类模型实训步骤 (以 Logistic 回归为例)
  • 单链表和双向链表区别 and 双向链表的增删改查!
  • GC1272替代APX9172/茂达中可应用于电脑散热风扇应用分析
  • STM32——USART原理及应用
  • Springboot + zset + lua 实现滑动窗口
  • 【JAVA-数据结构】二叉树
  • 离岗睡岗预警系统 值班室离岗识别系统Python 结合 OpenCV 库
  • 【工具】一些很不错的资源合集
  • 2024百度云智大会|百度大模型内容安全合规探索与实践
  • day11-SpringMVC
  • JavaScript(JS)基础(二)
  • DB2数据库学习(一)
  • Linux 环境chrony设置服务器间时间同步一致
  • 代码签名证书怎么申请?