• 题目描述

    ​ 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    ​ 例如:

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package main

    /*
    @Time : 2020/8/26 12:42
    @Author : austsxk
    @Email : austsxk@163.com
    @File : main.go
    @Software: GoLand
    */

    type ListNode struct {
    Val int
    Next *ListNode
    }

    func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    // new一个新的节点,保存相加后的链表
    // 如果l1 比 l2 短,则短的部分用0补充其值,反之亦然
    // 如果加出值 大于 10 ,则需要进行进位操作
    if l1 == nil && l2 != nil {
    return l2
    }
    if l2 == nil && l1 != nil {
    return l1
    }

    var head = new(ListNode)
    head.Val = 0
    // 当前节点
    currentNode, n1, n2, carry := head, 0, 0, 0
    // 只要
    for l1 != nil || l2 != nil || carry != 0 {
    // 1. 获取n1的值
    // 2. 修改next指针
    if l1 == nil {
    n1 = 0
    } else {
    n1 = l1.Val
    l1 = l1.Next
    }
    // 3. 获取n2的值
    // 4. 修改n2的指针
    if l2 == nil {
    n2 = 0
    } else {
    n2 = l2.Val
    l2 = l2.Next
    }
    // 5. 给新链表设置值
    currentNode.Next = &ListNode{Val: (n1 + n2 + carry) % 10}
    // 6. 修改新链表指针
    currentNode = currentNode.Next
    // 7. 判断是进位值
    carry = (n1 + n2 + carry) / 10
    }

    return head.Next
    }