1.1. 题目

1.1.1. 两数相加

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

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

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

示例:

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



1.1.2. 题解:

  • 两数相加其实是两链表相加
  • 根据示例可以看出,是把两链表从最后的节点往前算,凑成一个整数,然后两个整数相加,得出的结果 从 个位数开始拆成一个链表
  • 不过一定要注意! 如果真的当成 整数来算,可能会超出 整型的最大范围!!!!

1.1.3. 思路:

  • 一开始我是先把两链表转换成两个整数,然后相加,再把结果的整数拆分成 一个链表! 但是可能会超长的!!!!!
  • 后来发现了一个简单的方法
  • 比如例子吧,仔细看,链表1从值等于2的开始,链表2从值等于5开始,根据示例里的原因,是342 + 465,正常的两数相加也是从各位开始的,仔细看,个位数是不是就是25
  • 再看示例结果,个位数是在结果的链表的头节点的! 也就是说 7 是在排在最前面的
1->0->0->0->0->1
2->3->4

结果是

3->3->4->0->0->1
  • 看上面的两个链表相加,明显了吧,只要依次正常遍历链表,然后按照对应位置两数相加, 如果超过10,则取结果的个位数(结果-10),下一位就+1
  • 注意,如果一个链表比较短,那么 长链表可以 + 0
  • 另外注意 如果最后一位相加之和大于10,那么,最后还要再加一个1的节点 (比如 9->9->9 + 9->9->9)

1.1.4. 代码:

显示代码
    func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {

        // 定义一个 i 表示 两数相加是否大于10, 定义一个s表示两数两加之和
        var i,s int
        // 定义一个头节点
        res := &ListNode{Val:0}
        // 定义一个当前节点
        now := res

        // 无限循环,内部加条件跳出
        for true {
            // 如果 i >0 表示前面的数之和大于10了,所以当前的和要加1,否则不加
            if i > 0 {
                s = l1.Val + l2.Val + 1
            } else {
                s = l1.Val + l2.Val
            }
            // 如果 两数之和大于10,那么该位的值应该是 s - 10 ,否则就是 和 本身,并设置 i 标记
            if s >= 10 {
                now.Next = &ListNode{Val:s - 10}
                i = 1
            } else {
                now.Next = &ListNode{Val:s}
                i = 0
            }
            // 将 当前节点移动到下一指针
            now = now.Next

            // 当l1 和 l2 都移动到最后了,准备跳出循环
            if l1.Next == nil && l2.Next == nil {
                // 如果l1 和 l2 最后的和大于10,即 i == 1, 那么后面还需要添加一个 1 (小学数学问题,不用解释为什么是1吧)
                if i == 1 {
                    now.Next = &ListNode{Val:1}
                }
                // 跳出循环
                break
            }
            // 如果 l1走到了最后,可能l2 还没结束,所以把l1的当前节点值设置成0,继续跟l2相加,否则移动到下一指针
            if l1.Next == nil {
                l1.Val = 0
            } else {
                l1 = l1.Next
            }
            // 如果 l2走到了最后,可能l1 还没结束,所以把l2的当前节点值设置成0,继续跟l1相加,否则移动到下一指针
            if l2.Next == nil {
                l2.Val = 0
            } else {
                l2 = l2.Next
            }
        }

        // 返回头节点的下一个节点指针,因为头节点是我设置成0的
        return res.Next
    }

results matching ""

    No results matching ""