LeetCode-两数相加
1.LeetCode-两数之和
2.LeetCode-两数相加
前言
这道题将整数加法转换为在单链表上做加法运算,涉及到知识点:
- 单链表的遍历
- 单链表插入新节点
题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
示例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
-
题目数据保证列表表示的数字不含前导零
题目分析
单链表遍历只能 单向单步:给定一个节点的指针,那么它只能访问下一个节点的内容。单链表的遍历时间复杂度唯一:
注意到:由于每个节点只能存储一位数字,那么两个对应位相加的最大值为 进位
最大只会为 1 。
暴力算法
就像普通的十进制数加法一样,每一位相加后对
假设
因此给出数学公式:
解题代码
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* head = new ListNode(); ListNode* cur = head; int t = 0; while ( l1 || l2) { if ( l1) { t += l1->val; l1 = l1->next; } if ( l2) { t += l2->val; l2 = l2->next; } ListNode* nnew = new ListNode(t % 10); cur->next = nnew; t /= 10; cur = cur->next; // 准备下一次的增加新节点 } if ( t ) { ListNode* nnew = new ListNode(1); cur->next = nnew; } return head->next; } };
复杂度分析
最终我们的时间复杂度为
我们在刚开始刷题的时候,可以先试着自己写出暴力算法,然后分析一下时间复杂度,再尝试其他解题方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了