LeetCode#2-Add Two Numbers-两数相加
一、题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
二、题解
特殊情况:
1)一个链表比另一个链表长;
2)一个链表为空,另一个链表不为空;
3)求和运算可能出现进位。
具体步骤:
1)设置一个哑节点,并将当前节点初始化为这个哑节点;
2)将进位 carry 初始化为 0;
3)遍历列表 l1 和 l2 直至到达它们的尾端:
① 将 x 设为 l1 的节点。如果 x 已经到达 l1 的末尾,则将其值设置为 0;
② 将 y 设为 l2 的节点。如果 y 已经到达 l2 的末尾,则将其值设置为 0;
③ 和为 Sum = x + y + carry
;
④ 更新进位的值 carry = Sum / 10
;
⑤ 和对 10 取余,Sum = Sum % 10
;创建这个结果的节点,并将其设置为当前结点的下一个节点,同时将当前节点前进到下一个节点;
4)如果两个链表全部遍历完毕后,进位值 carry = 1,则在新链表最前方添加节点 1;
5)返回哑节点的下一个节点。
时间复杂度:O(n),空间复杂度:O(n)。
function addTwoNumbers($l1, $l2) {
$carry = 0;
$dummyHead = new ListNode(0);
$cur = $dummyHead;
while ($l1 !== null || $l2 !== null) {
echo $carry . "<br>";
$x = $l1 == null ? 0 : $l1->val;
$y = $l2 == null ? 0 : $l2->val;
$sum = $carry + $x + $y;
$carry = floor($sum / 10);
$sum = $sum % 10;
$cur->next = new ListNode($sum);
$cur = $cur->next;
if ($l1 !== null) {
$l1 = $l1->next;
}
if ($l2 !== null) {
$l2 = $l2->next;
}
}
if($carry == 1) {
$cur->next = new ListNode($carry);
}
return $dummyHead->next;
}
分类:
LeetCode刷题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!