【练习】【链表】力扣热题100 2. 两数相加

题目

  1. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]

输出:[7,0,8]

解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]

输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]

输出:[8,9,9,9,0,0,0,1]

来源:力扣热题100 2. 两数相加


思路(注意事项)

代码精简将三个while和一个if合并,使得代码精简很多。


代码精简

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* head = new ListNode(0); // 虚拟头节点
        ListNode* p = head; // 当前节点指针
        int flag = 0; // 进位标志

        // 遍历两个链表
        while (l1 != nullptr || l2 != nullptr || flag != 0) {
            int sum = flag; // 初始化为进位值
            if (l1 != nullptr) {
                sum += l1->val;
                l1 = l1->next;
            }
            if (l2 != nullptr) {
                sum += l2->val;
                l2 = l2->next;
            }

            flag = sum >= 10 ? 1 : 0; // 更新进位标志
            sum %= 10; // 取个位数

            p->next = new ListNode(sum); // 创建新节点并连接到链表
            p = p->next; // 移动当前节点指针
        }

        return head->next; // 返回结果链表的头节点
    }
};

纯代码

class Solution {
private:
    void func (int sum)
    {
        flag = sum >= 10 ? 1 : 0;
        sum %= 10;
        ListNode* l = new ListNode(sum);
        p -> next = l;
        p = p ->next;
    }
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* head = new ListNode(0);
        ListNode *p = head;
        int flag = 0;

        while (l1 != nullptr && l2 != nullptr)
        {
            int sum = l1 -> val + l2 -> val + flag;
            func(sum);
            l1 = l1 -> next;
            l2 = l2 -> next;
        }

        while (l1 != nullptr) 
        {
            int sum = l1 -> val + flag;
            func(sum);
            l1 = l1 -> next;
        }

        while (l2 != nullptr) 
        {
            int sum = l2 -> val + flag;
            func(sum);
            l2 = l2 -> next;
        }

        if (flag == 1)
        {
            ListNode* l = new ListNode(1);
            p -> next = l;
        }
        return head -> next;

    }
};

题解(加注释)

class Solution {
private:
    int flag = 0; // 进位标志,初始化为 0
    ListNode* p = nullptr; // 当前节点指针,用于构建新链表

    // 辅助函数:处理当前位的和,并更新链表
    void func(int sum) {
        flag = sum >= 10 ? 1 : 0; // 判断是否需要进位
        sum %= 10; // 取个位数

        ListNode* l = new ListNode(sum); // 创建新节点
        p->next = l; // 将新节点连接到链表
        p = p->next; // 移动当前节点指针
    }

public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* head = new ListNode(0); // 创建虚拟头节点
        p = head; // 初始化当前节点指针

        // 遍历两个链表,逐位相加
        while (l1 != nullptr && l2 != nullptr) {
            int sum = l1->val + l2->val + flag; // 计算当前位的和(包括进位)
            func(sum); // 处理当前位的和

            l1 = l1->next; // 移动 l1 指针
            l2 = l2->next; // 移动 l2 指针
        }

        // 处理 l1 剩余的节点
        while (l1 != nullptr) {
            int sum = l1->val + flag; // 计算当前位的和(包括进位)
            func(sum); // 处理当前位的和

            l1 = l1->next; // 移动 l1 指针
        }

        // 处理 l2 剩余的节点
        while (l2 != nullptr) {
            int sum = l2->val + flag; // 计算当前位的和(包括进位)
            func(sum); // 处理当前位的和

            l2 = l2->next; // 移动 l2 指针
        }

        // 如果最后还有进位,添加一个新节点
        if (flag == 1) {
            ListNode* l = new ListNode(1);
            p->next = l;
        }

        return head->next; // 返回结果链表的头节点(跳过虚拟头节点)
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981377.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【FL0090】基于SSM和微信小程序的球馆预约系统

🧑‍💻博主介绍🧑‍💻 全网粉丝10W,CSDN全栈领域优质创作者,博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发…

因子分析讲解

一、定义 因子分析(Factor Analysis)是一种常用于多变量统计分析的方法,主要用于数据降维、识别潜在的结构、理解变量间的关系。它通过将一组观察变量(通常是高度相关的变量)转化为一组较少的、互不相关的因子&#x…

从 JVM 源码(HotSpot)看 synchronized 原理

大家好,我是此林。 不知道大家有没有这样一种感觉,网上对于一些 Java 框架和类的原理实现众说纷纭,看了总是不明白、不透彻。常常会想:真的是这样吗? 今天我们就从 HotSpot 源码级别去看 synchronized 的实现原理。全…

DeepSeek搭配Excel,制作自定义按钮,实现办公自动化!

今天跟大家分享下我们如何将DeepSeek生成的VBA代码,做成按钮,将其永久保存在我们的Excel表格中,下次遇到类似的问题,直接在Excel中点击按钮,就能10秒搞定,操作也非常的简单. 一、代码准备 代码可以直接询问…

Metal学习笔记十一:贴图和材质

在上一章中,您设置了一个简单的 Phong 光照模型。近年来,研究人员在基于物理的渲染 (PBR) 方面取得了长足的进步。PBR 尝试准确表示真实世界的着色,真实世界中离开表面的光量小于表面接收的光量。在现实世界中&#xf…

zabbix“专家坐诊”第277期问答

在线答疑:乐维社区 问题一 Q:这个怎么解决呢? A:缺少这个依赖。 Q:就一直装不上。 A:装 zabbix-agent2-7.0.0-releasel.el7.x86 64 需要前面提示的那个依赖才可以装。 问题二 Q:大佬,如果agen…

让单链表不再云里雾里

一日不见,如三月兮!接下来与我一起创建单链表吧! 目录 单链表的结构: 创建单链表: 增加结点: 插入结点: 删除结点: 打印单链表: 单链表查找: 单链表…

图像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image

图像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image 文章目录 图像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image主要创新点模型架构图生成器生成器源码 判别器判别器源码 损失函数需要源码讲解的私信我 S…

指纹细节提取(Matlab实现)

指纹细节提取概述指纹作为人体生物特征识别领域中应用最为广泛的特征之一,具有独特性、稳定性和便利性。指纹细节特征对于指纹识别的准确性和可靠性起着关键作用。指纹细节提取,即从指纹图像中精确地提取出能够表征指纹唯一性的关键特征点,是…

泵吸式激光可燃气体监测仪:快速精准守护燃气管网安全

在城市化进程加速的今天,燃气泄漏、地下管网老化等问题时刻威胁着城市安全。如何实现精准、高效的可燃气体监测,守护“城市生命线”,成为新型基础设施建设的核心课题。泵吸式激光可燃气体监测仪,以创新科技赋能安全监测&#xff0…

HTML label 标签使用

点击 <label> 标签通常会使与之关联的表单控件获得焦点或被激活。 通过正确使用 <label> 标签&#xff0c;可以使表单更加友好和易于使用&#xff0c;同时提高整体的可访问性。 基本用法 <label> 标签通过 for 属性与 id 为 username 的 <input> 元素…

数字万用表的使用教程

福禄克经济型数字万用表前面板按键功能介绍示意图 1. 万用表简单介绍 万用表是一种带有整流器的、可以测量交、直流电流、电压及电阻等多种电学参量的磁电式仪表。分为数字万用表&#xff0c;钳形万用表&#xff0c; &#xff08;1&#xff09;表笔分为红、黑二只。使用时黑色…

Python 爬取唐诗宋词三百首

你可以使用 requests 和 BeautifulSoup 来爬取《唐诗三百首》和《宋词三百首》的数据。以下是一个基本的 Python 爬虫示例&#xff0c;它从 中华诗词网 或类似的网站获取数据并保存为 JSON 文件。 import requests from bs4 import BeautifulSoup import json import time# 爬取…

2025年AI PPT工具精选:让演示文稿更智能、更高效

&#x1f4a1; 做PPT太难&#xff1f;没灵感&#xff1f;排版不好看&#xff1f;别怕&#xff0c;AI已经帮你安排好了&#xff01; 想知道2025年最值得推荐的AI PPT工具是哪款&#xff1f;答案就是——秒出PPT&#xff01;&#x1f680; 不仅能一键生成PPT&#xff0c;还能自…

qt-C++笔记之ubuntu22.04源码安装Qt6.8.2

qt-C笔记之ubuntu22.04源码安装Qt6.8.2 code review! 文章目录 qt-C笔记之ubuntu22.04源码安装Qt6.8.21.作者环境&#xff1a;ubuntu22.04、cmake202.安装3.关联已安装的 Qt6 到 Qt Creator4.附&#xff1a;ubuntu18.0的处理&#xff0c;可尝试&#xff0c;作者没有遇到这个问题…

单例模式(线程案例)

单例模式可以分为两种&#xff1a;1.饿汉模式 2.懒汉模式 一.饿汉模式 //饿汉模式&#x1f447; class MySingleTon{//因为这是一个静态成员变量&#xff0c;在类加载的时候&#xff0c;就创建了private static MySingleTon mySingleTon new MySingleTon();//创建一个静…

基于Matlab的多目标粒子群优化

在复杂系统的设计、决策与优化问题中&#xff0c;常常需要同时兼顾多个相互冲突的目标&#xff0c;多目标粒子群优化&#xff08;MOPSO&#xff09;算法应运而生&#xff0c;作为群体智能优化算法家族中的重要成员&#xff0c;它为解决此类棘手难题提供了高效且富有创新性的解决…

(2025年)工会考试该如何高效备考?有学习方法吗?

工会考试备考文章 工会考试高效备考指南 工会在维护职工权益、促进企业和谐发展中扮演着重要角色&#xff0c;工会考试则是选拔优秀工会工作者的关键途径。面对工会考试涉及的法律法规、组织管理以及维权服务等多方面知识&#xff0c;掌握科学备考方法是成功的关键。 法律法规是…

《机器学习数学基础》补充资料:向量范数

《机器学习数学基础》第1章1.5.3节介绍了向量范数的基本定义。 本文在上述基础上&#xff0c;介绍向量范数的有关性质。 注意&#xff1a; 以下均在欧几里得空间讨论&#xff0c;即欧氏范数。 1. 性质 实&#xff08;或复&#xff09;向量 x \pmb{x} x &#xff0c;范数 ∥…

Unity NGUI新手向几个问题记录

1.点Button没反应 制作Button组件时&#xff0c;不光要挂载Button脚本&#xff0c;还有挂载BoxCollider BoxCollider 接收事件 2.Button点击事件的增加与删除 使用.onClick.add增加事件&#xff0c;使用.onClick.Remove,.onClick.RemoveAt,onClick.RemoveRang,onClick.Clear移…