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

[LeetCode] 2.两数相加

一、题目描述

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

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

你可以假设除了数字 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
  • 题目数据保证列表表示的数字不含前导零

二、题解

2.1 模拟法

由于输入的两个链表都是逆序存储数字的位数的,因此两个链表中同一位置的数字可以直接相加。

我们同时遍历两个链表,逐位计算它们的和,并与当前位置的进位值相加。具体而言,如果当前两个链表处相应位置的数字为 n 1 n1 n1, n 2 n2 n2,进位值为 c a r r y carry carry,则它们的和为 n 1 + n 2 + c a r r y n1+n2+carry n1+n2+carry;其中,答案链表处相应位置的数字为 ( n 1 + n 2 + c a r r y ) m o d 10 (n1+n2+carry) mod 10 (n1+n2+carry)mod 10,而新的进位值为 ⌊ n 1 + n 2 + c a r r y 10 ⌋ ⌊\frac{n1+n2+carry}{10}⌋ 10n1+n2+carry

如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个 0 。

此外,如果链表遍历结束后,有 c a r r y > 0 carry>0 carry>0,还需要在答案链表的后面附加一个节点,节点的值为 c a r r y carry carry

2.1.1 Python

def addTwoNumbers(l1, l2):head = tail = Nonecarry = 0while l1 or l2:n1 = l1.val if l1 else 0n2 = l2.val if l2 else 0sum = n1 + n2 + carryif not head:head = tail = ListNode(sum % 10)else:tail.next = ListNode(sum % 10)tail = tail.nextcarry = sum // 10if l1:l1 = l1.nextif l2:l2 = l2.nextif carry > 0:tail.next = ListNode(carry)return head

2.1.2 C++

 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode *head = nullptr, *tail = nullptr;int carry = 0;while (l1 || l2) {int n1 = l1 ? l1->val: 0;int n2 = l2 ? l2->val: 0;int sum = n1 + n2 + carry;if (!head) {head = tail = new ListNode(sum % 10);} else {tail->next = new ListNode(sum % 10);tail = tail->next;}carry = sum / 10;if (l1) {l1 = l1->next;}if (l2) {l2 = l2->next;}}if (carry > 0) {tail->next = new ListNode(carry);}return head;
}

2.1.3 C

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) 
{struct ListNode *head = NULL, *tail = NULL;int carry = 0;while (l1 || l2) {int n1 = l1 ? l1->val : 0;int n2 = l2 ? l2->val : 0;int sum = n1 + n2 + carry;if (!head) {head = tail = malloc(sizeof(struct ListNode));tail->val = sum % 10;tail->next = NULL;}else {tail->next = malloc(sizeof(struct ListNode));tail->next->val = sum % 10;tail = tail->next;tail->next = NULL;}carry = sum / 10;if (l1) {l1 = l1->next;}if (l2) {l2 = l2->next;}}if (carry > 0) {tail->next = malloc(sizeof(struct ListNode));tail->next->val = carry;tail->next->next = NULL;}return head;
}

2.1.4 复杂度分析

  • 时间复杂度: O ( m a x ⁡ ( m , n ) ) O(max⁡(m,n)) O(max(m,n)),其中 m m m n n n 分别为两个链表的长度。我们要遍历两个链表的全部位置,而处理每个位置只需要 O ( 1 ) O(1) O(1)的时间。

  • 空间复杂度: O ( 1 ) O(1) O(1)。注意返回值不计入空间复杂度。

相关文章:

  • 机器人物理交互场景及应用的实际意义
  • FreeRTOS笔记【一】 任务的创建(动态方法和静态方法)
  • JAVA整理学习实例(二)Object类
  • 正点原子嵌入式linux驱动开发——Linux WIFI驱动
  • 软考高级系统架构设计师系列之:软件可靠性基础
  • centos9 stream 下 rabbitmq高可用集群搭建及使用
  • oracle 基础语法总结
  • 【操作系统】进程调度
  • UE5C++学习(一)--- 增强输入系统
  • MYSQL:索引与锁表范围简述
  • Python 解压静态库 .a 和 .lib 文件
  • 【蓝桥杯】2023省赛H题
  • springboot前后端时间类型传输
  • Ansible的role
  • 0基础学习PyFlink——使用datagen生成流式数据
  • canvas绘制圆角头像
  • golang 发送GET和POST示例
  • golang中接口赋值与方法集
  • IDEA常用插件整理
  • java第三方包学习之lombok
  • java中具有继承关系的类及其对象初始化顺序
  • JWT究竟是什么呢?
  • Mithril.js 入门介绍
  • nginx 负载服务器优化
  • spring-boot List转Page
  • vue中实现单选
  • 安装python包到指定虚拟环境
  • 订阅Forge Viewer所有的事件
  • 分享几个不错的工具
  • 高程读书笔记 第六章 面向对象程序设计
  • 给初学者:JavaScript 中数组操作注意点
  • 规范化安全开发 KOA 手脚架
  • 如何胜任知名企业的商业数据分析师?
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 手机端车牌号码键盘的vue组件
  • 详解移动APP与web APP的区别
  • 移动端高清、多屏适配方案
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (4)logging(日志模块)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (搬运以学习)flask 上下文的实现
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core 控制台应用程序读取配置文件app.config
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @取消转义
  • [ JavaScript ] JSON方法
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [BZOJ4010]菜肴制作
  • [C++]打开新世界的大门之C++入门