Golang两数相加

题目

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 } }

程序运行后,控制台输出如下:

02_golang两数相加.png

我们使用了三种方式来实现。