LeetCode-热题100:2. 两数相加

news2025/1/15 12:58:06

题目描述

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

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

你可以假设除了数字 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]

提示:

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

代码及注释

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    // 创建一个虚拟头节点作为结果链表的起始节点
    dummy := &ListNode{}
    // 创建一个指针 cur 指向当前结果链表的末尾
    cur := dummy
    // 创建一个变量 reminder 用于记录进位
    reminder := 0
    
    // 遍历两个链表,将对应节点的值相加,考虑进位,构建结果链表
    for l1 != nil && l2 != nil {
        // 计算当前节点的值,并考虑进位
        sum := l1.Val + l2.Val + reminder
        // 更新进位
        reminder = sum / 10
        // 将当前节点的值加入到结果链表中
        cur.Next = &ListNode{Val: sum % 10}
        // 移动指针到下一个节点
        l1 = l1.Next
        l2 = l2.Next
        cur = cur.Next
    }
    
    // 处理其中一个链表还有剩余节点的情况
    for l1 != nil {
        // 计算当前节点的值,并考虑进位
        sum := l1.Val + reminder
        // 更新进位
        reminder = sum / 10
        // 将当前节点的值加入到结果链表中
        cur.Next = &ListNode{Val: sum % 10}
        // 移动指针到下一个节点
        l1 = l1.Next
        cur = cur.Next
    }

    for l2 != nil {
        // 计算当前节点的值,并考虑进位
        sum := l2.Val + reminder
        // 更新进位
        reminder = sum / 10
        // 将当前节点的值加入到结果链表中
        cur.Next = &ListNode{Val: sum % 10}
        // 移动指针到下一个节点
        l2 = l2.Next
        cur = cur.Next
    }

    // 处理最高位有进位的情况
    if reminder > 0 {
        cur.Next = &ListNode{Val: reminder}
    }
    
    // 返回结果链表,从虚拟头节点的下一个节点开始
    return dummy.Next
}

代码解释

初始化

  • dummy 虚拟头节点:创建一个虚拟的头节点 dummy,用于指向结果链表的开始,这样在处理时可以简化逻辑,不需要特殊处理头节点。

  • cur 指针:创建一个指针 cur,指向当前结果链表的末尾,用于构建结果链表。

  • reminder 进位:创建一个 reminder 变量,用于记录每一步的进位值。

    dummy := &ListNode{}
    cur := dummy
    reminder := 0
    

遍历链表并相加

  • 使用一个循环遍历两个链表 l1l2,同时将对应位置的节点值相加,并考虑上一步的进位值。

    for l1 != nil && l2 != nil {
        sum := l1.Val + l2.Val + reminder
        reminder = sum / 10
        cur.Next = &ListNode{Val: sum % 10}
        l1 = l1.Next
        l2 = l2.Next
        cur = cur.Next
    }
    

处理剩余的链表节点

  • 如果其中一个链表 l1 还有剩余的节点,将其与 reminder 相加并添加到结果链表中。

    for l1 != nil {
        sum := l1.Val + reminder
        reminder = sum / 10
        cur.Next = &ListNode{Val: sum % 10}
        l1 = l1.Next
        cur = cur.Next
    }
    
    for l2 != nil {
        sum := l2.Val + reminder
        reminder = sum / 10
        cur.Next = &ListNode{Val: sum % 10}
        l2 = l2.Next
        cur = cur.Next
    }
    

处理最高位的进位

  • 如果在处理完两个链表的所有节点后,reminder 仍然大于 0,需要在结果链表的最后添加一个新的节点来表示这个进位。

    if reminder > 0 {
        cur.Next = &ListNode{Val: reminder}
    }
    

返回结果链表

  • 返回结果链表,从虚拟头节点 dummy 的下一个节点开始。

    return dummy.Next
    

通过这种方式,我们可以高效地计算出两个链表的和,并得到正确的结果。这个算法的时间复杂度是 O(max(n, m)),其中 n 和 m 分别是两个链表的长度。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot大学生兼职平台管理系统(完整源码+数据库)

一、项目简介 本项目是一套基于springboot大学生兼职平台管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功…

LabVIEW电动汽车供电设备接触电流测试

LabVIEW电动汽车供电设备接触电流测试 随着电动汽车技术的迅猛发展和普及率的不断提高&#xff0c;电动汽车供电设施的电气安全显得尤为重要。为了优化电动汽车供电设备接触电流的测试方案&#xff0c;设计了一种基于LabVIEW的测试方案&#xff0c;通过平台校准测试和电动汽车…

Linux第2课Windows下的环境配置-虚拟机安装

文章目录 Linux第2课Windows下的环境配置-虚拟机安装一、VMware虚拟机的安装&#xff08;一&#xff09;安装VMware&#xff08;二&#xff09;启动电脑本地的VMware相关服务 二、VirtualBox安装 Linux第2课Windows下的环境配置-虚拟机安装 本节课程提供了两种虚拟机的安装方法…

程序员延寿指南:科学延寿 20 年 | 开源日报 No.214

geekan/HowToLiveLonger Stars: 28.7k License: Unlicense HowToLiveLonger 是一个程序员延寿指南项目。 该项目旨在提供关于如何延长寿命的指南&#xff0c;特别是针对程序员群体。该项目包括术语、目标、关键结果、分析、行动和证据等内容&#xff0c;涵盖了各种与健康相关的…

不同路径- java

题目描述: 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff…

模块化编程:AMD 和 CMD 的魅力

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

特定领域软件体系结构

1.DSSA的定义 简单地说&#xff0c;DSSA&#xff08;Domain Specific Software Architecture&#xff09;就是在一个特定应用领域中为一组应用提供组织结构参考的标准软件体系结构。 从功能覆盖的范围的角度有两种理解DSSA中领域的含义的方式&#xff1a; &#xff08;1&#x…

前端三剑客 —— CSS ( 坐标问题 、定位问题和图片居中 )

前期内容回顾&#xff1a; 1.常见样式 text-shadow x轴 y轴 阴影的模糊程度 阴影的颜色 box-shadow border-radio 实现圆角 margin 内边距 padding 外边距 background 2.特殊样式 媒体查询&#xff1a;media 自定义字体&#xff1a;font-face { font-family:自定义名称&#…

【随笔】Git -- 高级命令(中篇)(七)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

BioMedKGs:算法生成医学知识图谱,解决构建和维护工作量巨大问题

BioMedKGs&#xff1a;算法生成医学知识图谱&#xff0c;解决构建和维护工作量巨大问题 提出背景对比传统方法 算法设计3.1 自动化命名实体识别&#xff08;NER&#xff09;3.2 术语发现与清洗3.3 同义词分组形成概念3.4 多语言、机器翻译3.5 语义类型分类3.6 关系提取3.7 数据…

ArcGIS 10.8中文版详细安装教程(附安装包)

ArcGIS 10.8中文版详细安装教程&#xff08;附安装包&#xff09; 关键词&#xff1a;ArcGIS 10.8中文版安装 1.概述 ArcGIS Desktop 10.8中文版是由ESRI公司开发的一款专业的地理信息系统&#xff0c;一套完整的桌面GIS软件套件&#xff0c;它包含ArcMap、ArcCatalog、ArcG…

简约轻量-失信录系统源码

失信录系统-最新骗子收录查询系统源码 首页查询&#xff1a; 举报收录页&#xff1a; 后台管理页&#xff1a; 失信录系统 V1.0.0 更新内容&#xff1a; 1.用户查询,举报功能 2.界面独立开发 3.拥有后台管理功能 4.xss,sql安全过滤 5.平台用户查询 6.用户中心&#xff08;待完…

【C】leetcode力扣—— 141. 环形链表Ⅰ

目录 141. 环形链表 Ⅰ题目解题思路分析暴力求解&#xff1f;&#xff1f;快慢指针 代码 141. 环形链表 Ⅰ 题目链接: https://leetcode.cn/problems/linked-list-cycle/description/ 题目 题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某…

相对论中关于光速不变理解的补充

近几个月在物理直播间聊爱因斯坦相对论&#xff0c;发现好多人在理解爱因斯坦相对论关于基本假设&#xff0c;普遍认为光速是不变的&#xff0c;质能方程 中光速的光速不变的&#xff0c;在这里我对这个假设需要做一个补充&#xff0c;他是基于质能方程将光速C 在真是光速变化曲…

基于k8s的高性能综合web服务器搭建

目录 基于k8s的高性能综合web服务器搭建 项目描述&#xff1a; 项目规划图&#xff1a; 项目环境&#xff1a; k8s&#xff0c; docker centos7.9 nginx prometheus grafana flask ansible Jenkins等 1.规划设计整个集群的架构&#xff0c;k8s单master的集群环境&…

的C++奇迹之旅:值和引用的本质效率与性能比较

文章目录 请添加图片描述 [TOC](文章目录) &#x1f4dd;引用# &#x1f320;引用概念**引用**不是新定义一个变量&#xff0c;而是给**已存在变量取了一个别名**&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。>定义&#…

路由器怎么做端口映射?

路由器作为连接网络的关键设备&#xff0c;在家庭和办公网络中扮演着重要的角色。除了将互联网连接到局域网中&#xff0c;路由器还提供了一些常用的功能&#xff0c;其中之一就是端口映射。 什么是路由器端口映射&#xff1f; 在了解路由器端口映射之前&#xff0c;我们先来了…

HarmonyOS NEXT应用开发之@Provide装饰器和\@Consume装饰器:与后代组件双向同步

Provide和Consume&#xff0c;应用于与后代组件的双向数据同步&#xff0c;应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递&#xff0c;Provide和Consume摆脱参数传递机制的束缚&#xff0c;实现跨层级传递。 其中Provide装饰的变…

前端三剑客 —— CSS (第六节)

目录 内容回顾&#xff1a; 弹性布局属性介绍 案例演示 商品案例 布局分析 登录案例 网格布局 内容回顾&#xff1a; 变量&#xff1a;定义变量使用 --名称&#xff1a;值&#xff1b; 使用变量&#xff1a; 属性名&#xff1a;var&#xff08;--名称&#xff09;&a…

Flutter 画笔(Paint)、绘制直线(drawLine)

override bool shouldRepaint(CustomPainter oldDelegate) > true; } class MyPainter extends CustomPainter { override void paint(Canvas canvas, Size size) { //画背景 var paint Paint() …isAntiAlias false …strokeWidth30.0 …color Colors.red; c…