【刷题日记】2. 两数相加
本次刷题日记的第 6 篇,力扣题为:2. 两数相加 ,中等
一、题目描述:
看到题目,给人的感觉是,两个数相加?what? 不就是两个数相加吗?这有啥难度,咋还中等
然而仔细查看具体题目内容和具体的示例之后,感觉还是蛮简单的,但是好像不知道咋写,如果 C 语言基础比较差的兄弟们(不知道链表咋玩的那种),这个题可能就不太好写
不过,这题确实也比较简单,有一定的 C 语言基础的兄弟,刷起来 soso 的,没啥压力,不过我们还是来分析和推演一下,不会的兄弟,也能会
二、思路分析:
1、这道题考察了什么思想?你的思路是什么?
我们先看看题目给我们暴露的信息有哪些:
- 给出的两个链表都是非空的,表示的数字是整数,且不是负数
- 链表的每一个节点只会存放一个整数,数字是 1 位数的 ,并且整个链表不会以 0 开头,除非链表只有一个节点,这个节点才有可能是 0
- 链表的顺序和正常给出的数字顺序是相反的,高位在链表尾,低位在链表头
有这些已知信息后,我们稍加思考一下,可以用正常的整数来模拟和推演一下:
以示例 3 为例:
css
复制代码
输入: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 指向目前的尾巴节点
四、总结:
该题虽然是中等类型的题目,不过思路还是比较简单和明确的,相对其他中等题来说没有那么复杂,只需要考虑好细节和进位问题即可
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~