1. 程式人生 > >Go語言的LeetCode刷題之旅-002-兩數相加

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 }