Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
【刷题日记】2. 两数相加
本次刷题日记的第 6 篇,力扣题为:2. 两数相加 ,中等
一、题目描述:
看到题目,给人的感觉是,两个数相加?what? 不就是两个数相加吗?这有啥难度,咋还中等
然而仔细查看具体题目内容和具体的示例之后,感觉还是蛮简单的,但是好像不知道咋写,如果 C 语言基础比较差的兄弟们(不知道链表咋玩的那种),这个题可能就不太好写
不过,这题确实也比较简单,有一定的 C 语言基础的兄弟,刷起来 soso 的,没啥压力,不过我们还是来分析和推演一下,不会的兄弟,也能会
二、思路分析:
1、这道题考察了什么思想?你的思路是什么?
我们先看看题目给我们暴露的信息有哪些:
- 给出的两个链表都是非空的,表示的数字是整数,且不是负数
- 链表的每一个节点只会存放一个整数,数字是 1 位数的 ,并且整个链表不会以 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 位,此时,咱们就需要向右边进 1 位
再演变到链表的话,逻辑完全一下,剩下的确实只是编码上的实现问题了,基础差的兄弟可能就不太好写,不过没事,多练,多练,多思考,就习惯了
2、尝试编码
根据上述的逻辑和推演,其实思想很简单,就是 2 个数字每个位对应相应,注意进位问题,注意高位在右边的问题即可
// 返回的链表 先指定一个头指针
func addTwoNumbers(l1, l2 *ListNode) (head *ListNode) {
// 先定义一个尾指针
var tail *ListNode
// 进位 ,默认为 0
carry := 0
// 校验 2 条链表,若有一个链表为空 则直接退出循环
for l1 != nil || l2 != nil {
n1, n2 := 0, 0
if l1 != nil {
n1 = l1.Val
l1 = l1.Next
}
if l2 != nil {
n2 = l2.Val
l2 = l2.Next
}
sum := n1 + n2 + carry
sum, carry = sum%10, sum/10
if head == nil {
head = &ListNode{Val: sum}
tail = head
} else {
tail.Next = &ListNode{Val: sum}
tail = tail.Next
}
}
// 基本链表已经形成,最后校验最后一个位是否有进位,若有,则放在链表尾即可
if carry > 0 {
tail.Next = &ListNode{Val: carry}
}
return
}
复制代码
此处的话,代码中,已经写上对应注释,还是简单说一下:
- 一开始,先建立一个 头指针 head ,一个 尾指针
- 校验链表符合条件之后,分别取出两个链表的头指针数据,进行相加,若有进位,则将进位复制到 carry 中
- 确定对应位上两数之和后,若 head 为空,则将结果给到 head,并且此时 tail也指向 head (因为此时链表中就 1 个节点)
- 若 head 不为空,则将结果给到 tail 的下一个节点,再将 tail 指向目前的尾巴节点
四、总结:
该题虽然是中等类型的题目,不过思路还是比较简单和明确的,相对其他中等题来说没有那么复杂,只需要考虑好细节和进位问题即可
本题的 时间复杂度就是 O(max(m,n)) ,此处的 m 和 n,表示 2 条链表各自的长度,谁长,复杂度就以谁为准
空间复杂度是 O(max(m,n)) 如果结果链表比给出的两个链表中的长度要长,那么只能是进位了,最长时候的空间复杂度是 O(max(m,n) + 1)
原题地址:2. 两数相加
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是小魔童哪吒,欢迎点赞关注收藏,下次见~