单链表的简单使用,可以变形为大数相加,模拟加法的运算过程
package main
import (
"fmt"
)
type ListNode struct {
Val int
Next *ListNode
}
func (l *ListNode) AppendNode(num int) {
tempNoode := new(ListNode)
tempNoode.Val = num
if l.Next == nil {
l.Next = tempNoode
} else {
for l.Next != nil {
l = l.Next
}
l.Next = tempNoode
}
}
func (l *ListNode) PrintNode() {
fmt.Println(l.Val)
for l.Next != nil {
l = l.Next
fmt.Println(l.Val)
}
}
func main() {
temp1 := new(ListNode)
temp1.AppendNode(2)
temp1.AppendNode(4)
temp1.AppendNode(3)
temp2 := new(ListNode)
temp2.AppendNode(5)
temp2.AppendNode(6)
temp2.AppendNode(4)
l1 := temp1.Next
l2 := temp2.Next
l3 := addTwoNumbers(l1, l2)
l3.PrintNode()
}
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
res := new(ListNode)
lastNode := res
temp := 0
for l1 != nil || l2 != nil || temp != 0 {
v1 := 0
v2 := 0
if l1 != nil {
v1 = l1.Val
l1 = l1.Next
}
if l2 != nil {
v2 = l2.Val
l2 = l2.Next
}
sum := v1 + v2 + temp
// 保留进位数
temp = sum / 10
// 取个位数
addSum := sum % 10
lastNode.Val = addSum
if l1 != nil || l2 != nil || temp != 0 {
lastNode.Next = new(ListNode)
} else {
lastNode.Next = nil
}
lastNode = lastNode.Next
}
return res
}