用 Golang 实现,给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
}
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
var v1, v2, nextVal int
nextVal = 0
l3 := new(ListNode)
hNode1 := l3
for {
if l1 == nil && l2 == nil {
break
}
if l1 != nil {
v1 = l1.Val
l1 = l1.Next
}else {
v1 = 0
}
if l2 != nil {
v2 = l2.Val
l2 = l2.Next
}else {
v2 = 0
}
tempNode2 := new(ListNode)
if v1 + v2 + nextVal >= 10 {
tempNode2.Val = v1 + v2 + nextVal -10
nextVal = 1
}else {
tempNode2.Val = v1 + v2 + nextVal
nextVal = 0
}
l3.Next = tempNode2
l3 = l3.Next
}
if nextVal == 1 {
tempNode2 := new(ListNode)
tempNode2.Val = 1
l3.Next = tempNode2
l3 = l3.Next
}
return hNode1.Next
}
func addTwoNumbers2(l1 *ListNode, l2 *ListNode) *ListNode {
res := &ListNode{0, nil} //头指针
lastNode := res // 链表尾部游标
rest := 0 // 加法大于10进位
for {
val := rest
if l1 != nil {
val += (*l1).Val
l1 = (*l1).Next
}
if l2 != nil {
val += (*l2).Val
l2 = (*l2).Next
}
if val == 0 && l1 == nil && l2 == nil {
// 判断两条链表是否均已到达尾部
if (*res).Next == nil {
// 俩个链表均为 {0 nil}
return res
}
return (*res).Next
}
if val >= 10 {
val -= 10
rest = 1
} else {
rest = 0
}
partsum := ListNode{val, nil}
(*lastNode).Next = &partsum
lastNode = &partsum
}
}
func addTwoNumbers3(l1 *ListNode, l2 *ListNode) *ListNode {
var arr []int
rest := 0
for {
val := rest
if l1 != nil {
val += (*l1).Val
l1 = (*l1).Next
}
if l2 != nil {
val += (*l2).Val
l2 = (*l2).Next
}
if val == 0 && l1 == nil && l2 == nil {
if len(arr) == 0 {
arr = append(arr, val)
}
break
}
if val >= 10 {
val -= 10
rest = 1
} else {
rest = 0
}
arr = append(arr, val)
}
return ExportResult(arr)
}
func ExportResult(res []int) *ListNode {
length := len(res)
listNode := make([]ListNode, length)
listNode[0] = ListNode{res[0], nil}
for i := 1; i < length; i++ {
listNode[i] = ListNode{res[i], nil}
listNode[i-1].Next = &listNode[i]
}
return &listNode[0]
}
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
list1Node3 := &ListNode{
Val:3,
Next:nil,
}
list1Node2 := &ListNode{
Val:4,
Next:list1Node3,
}
list1Node1 := &ListNode{
Val:2,
Next:list1Node2,
}
list2Node3 := &ListNode{
Val:4,
Next:nil,
}
list2Node2 := &ListNode{
Val:6,
Next:list2Node3,
}
list2Node1 := &ListNode{
Val:5,
Next:list2Node2,
}
res := addTwoNumbers(list1Node1, list2Node1)
for{
fmt.Println(res.Val)
if res.Next == nil{
break
}
res = res.Next
}
}
程序运行后,控制台输出如下:
我们使用了三种方式来实现。