【刷题日记】2. 两数相加

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. 两数相加

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

おすすめ

転載: juejin.im/post/7074520770029977631