• 链表相加


    题目描述:

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

    如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

    您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807

    解题思路:

    假若我们的链表是 (2 -> 4 -> 3) + (5 -> 6 -> 4) ,大概就是这样(注意,这里我们其实是要完成 342 + 465):

    加法肯定是从最低位到最高位进行相加,也就是这里的链表头到链表尾进行相加,所以需要遍历链表。我们令 l1 和 l2 指向两个链表的头,用一个 tmp 值来存储同一位相加的结果,以及一个新的链表来存储 tmp 的值。(为什么不直接用新链表存储结果,而是用 tmp 先存储结果,再用新链表存储 tmp 的值呢?请继续往下看)

    记住:所有模拟运算的题目,都需要考虑进位。这里因为个位不涉及进位,开始计算十位。我们同时遍历 l1,l2,以及新链表到下一位。

    重复上面的操作,可以看到十位与个位不同,发生了进位。这时,刚才的 tmp 就有了用武之地。我们使用 tmp 携带进位的值到下一位的运算。自然,这里的链表也不能直接存储 tmp 的值了,而是要存储 tmp%10 的值。重复这个步骤,直到两个链表都遍历完成,并且 tmp 没有进位值

    现在只需要返回我们的新链表就可以了。问题来了,因为我们没有构造哨兵节点,所以此时不太容易直接返回新链表。所以在整个流程的第一步,我们还需要用一个哨兵节点指向我们的新链表。

    //go
    func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
     list := &ListNode{0, nil}
        //这里用一个result,只是为了后面返回节点方便,并无他用
     result := list
     tmp := 0
     for l1 != nil || l2 != nil || tmp != 0 {
      if l1 != nil {
       tmp += l1.Val
       l1 = l1.Next
      }
      if l2 != nil {
       tmp += l2.Val
       l2 = l2.Next
      }
      list.Next = &ListNode{tmp % 10, nil}
      tmp = tmp / 10
      list = list.Next
     }
     return result.Next
    }
    

      地址:https://mp.weixin.qq.com/s/YwmQw7A0qM74rz65QLfU9w

    small_lei_it 技术无止境,追求更高。
  • 相关阅读:
    grafana里prometheus查询语法
    Linux 高频工具快速教程
    国内开源镜像站点汇总
    Oracle DBLINK 简单使用
    启动OpenOffice服务
    使用openoffice转pdf,详细
    ORACLE数据库误操作执行了DELETE,该如何恢复数据?
    一个 介绍 superset Kylin 以及大数据生态圈的 博文
    Kylin介绍 (很有用)
    找到一些经验,关于使用thymeleaf时遇到的一些问题
  • 原文地址:https://www.cnblogs.com/smallleiit/p/13625031.html
Copyright © 2020-2023  润新知