leetcode 两个数相加以及测试用例 golang

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

package main

//链表实现
import (
"fmt"
"os"
)

//定义节点
type ListNode struct {
    Val int   //数值
    Next *ListNode //指针域,指向下一个节点
}

//添加 头结点,数据
func add(head *ListNode, val int) {
    point := head //临时指针
    for point.Next != nil {
        point = point.Next //移位
    }
    var node ListNode  //新节点
    point.Next = &node //赋值
    node.Val = val
}


//遍历 头结点
func traverse(head *ListNode) {
    point := head.Next
    fmt.Println("Traverse start!")
    for point.Next != nil {
        //fmt.Println(point.Next)
        fmt.Println(point.Val)
        point = point.Next
    }
    //最后一个绝对是为null的
    fmt.Println(point.Val)
    fmt.Println("Traverse OK!")
}

//主函数测试
func main() {
    var head1 ListNode = ListNode{Val: 0, Next: nil}
    var head2 ListNode = ListNode{Val: 0, Next: nil}
    head1.Val = 0
    head2.Val = 0

    a1 := []int{3,4,3}
    for _ , v := range a1 {
        add(&head1, v)

    }
    traverse(&head1)
    a2 := []int{1,2,9}
    for _ , v := range a2 {
        add(&head2, v)
    }
    traverse(&head2)
    head:=addTwoNumbers(&head1, &head2)
    traverse(head)
    os.Exit(0)
}


func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    var head ListNode = ListNode{Val: 0, Next: nil}
    point := &head
    carry := 0
    for (l1.Next != nil || l2.Next != nil) {
        var node ListNode
        l1Data := 0
        l2Data := 0
        if l1 = l1.Next; l1 != nil {
            l1Data = l1.Val
        }
        if l2 = l2.Next; l2 != nil {
            l2Data = l2.Val
        }
        sum := l1Data + l2Data + carry
        carry = 0
        node.Val = sum
        node.Next = nil
        if sum >= 10 {
            carry = 1
            node.Val = sum - 10
        }
        point.Next = &node
        point = point.Next //移位
    }
    if carry == 1 {
        var lastNode ListNode
        lastNode.Val = carry
        lastNode.Next = nil
        point.Next = &lastNode
        point = point.Next //移位
    }
    return &head
}

你可能感兴趣的:(算法)