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
}