Go語言的LeetCode刷題之旅-002-兩數相加
阿新 • • 發佈:2019-01-03
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
}