Mecanim 发表于 2022-6-13 11:46

【唐老狮】Unity、C# 每日一题 NO.2

题目

给你两个非空的链表,表示两个非负的整数
它们每位数字都是按照逆序的方式存储的
并且每个节点只能存储一位数字
请你将两个数相加,并以相同形式返回一个表示和的链表
你可以假设除了数字0之外,这两个数都不会以0开头



链表类



在函数中实现要求

规则示例

规则:


示例1:
输入:l1 = , l2 =
输出:
解释:342 + 465 = 807
示例2:
输入:l1 = , l2 =
输出:
解释:0 + 0 = 0
示例3:
输入:l1 = , l2 =

输出:
解释:9999999 + 9999 = 10009998

解题分析

我们以 352 + 56 举例分析



题目要求我们用两个链表相加得到一个新的链表,而链表中数字的顺序是从低位开始存储。刚好满足了我们做十进制加法的规则:从低位开始加
十进制加法的关键规则:

1.低位结果= (A + B + 上一位进位数) % 10
2.进位结果= (A + B + 上一位进位数) /10
举例分析:
352 + 56
个位相加:
个位计算结果 = (2 + 6 + 上一位进位数0) % 10 = 8
个位进位结果 = (2 + 6 + 上一位进位数0)/10 = 0


十位相加:
十位计算结果 = (5 + 5 + 上一位进位数0) % 10 = 0
十位进位结果 = (5 + 5 + 上一位进位数0)/ 10 = 1


百位相加:

百位计算结果 = (3 + 0 + 上一位进位数1) % 10 = 4
百位进位结果 = (3 + 0 + 上一位进位数1)/10 = 0


当L1和L2链表的下一位都是null
并且进位结果为0时
就证明我们不需要再往下计算了
于是得到结果:352 + 56 = 408

分步解题

第一步:声明用于返回的链表头节点以及用于计算的临时节点


第二步:通过上面的分析,每一位计算需要有上一位的进位数carry参与


第三步:构建计算每一位的循环

什么时候会不停计算?
L1还有节点 || L2还有节点 || 上一位有进位


第四步:进行每一位的计算
遵循十进制加法的关键规则:
1.低位结果= (A + B + 上一位进位数) % 10
2.进位结果= (A + B + 上一位进位数) /10



<hr/>关注 唐老狮 获取更多干货内容
页: [1]
查看完整版本: 【唐老狮】Unity、C# 每日一题 NO.2