Go语言的LeetCode刷题之旅-002-两数相加

Go语言的LeetCode刷题之旅-02-两数相加


题目:

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

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

示例:

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

思路:

(2 -> 4 -> 3)是 342

(5 -> 6 -> 4)是 465

(7 -> 0 -> 8)是 807

342 + 465 = 807

所以,题目的本意是,把整数换了一种表达方式后,实现其加法。

设计程序时候,需要处理的点有

位上的加法,需要处理进位问题
如何进入下一位运算
按位相加结束后,也还需要处理进位问题。


Go代码:

package problem0002

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
type ListNode struct {
    Val  int
    Next *ListNode
}

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    result := &ListNode{}
    temp := result
    v, n := 0, 0

    for {
        // 在当前位上进行加法运算
        v, n = add(l1, l2, n)
        temp.Val = v

        // 进入下一位
        l1 = next(l1)
        l2 = next(l2)
        // 如果两个数的下一位都为nil,则结束按位相加的运算
        if l1 == nil && l2 == nil {
            break
        }

        // 为下一位运算准备节点
        temp.Next = &ListNode{}
        temp = temp.Next
    }

    // n == 1 说明,最后一次加运算进位了,需要再添加一个节点。
    if n == 1 {
        temp.Next = &ListNode{Val: n}
    }

    return result
}

// next 进入l的下一位。
func next(l *ListNode) *ListNode {
    if l != nil {
        return l.Next
    }
    return nil
}

func add(n1, n2 *ListNode, i int) (v, n int) {
    if n1 != nil {
        v += n1.Val
    }

    if n2 != nil {
        v += n2.Val
    }

    v += i

    if v > 9 {
        v -= 10
        n = 1
    }

    return
}

你可能感兴趣的:(Golang,LeetCode,算法)