package main import ( "fmt" ) type ListNode struct { Val int Next *ListNode } func (l *ListNode) Print() { var tmp *ListNode = l for tmp != nil { fmt.Printf("%v", tmp.Val) tmp = tmp.Next } fmt.Printf("\n") } func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { var l1Tmp *ListNode = l1 var l2Tmp *ListNode = l2 var ret *ListNode = &ListNode{-1, nil} var retTail *ListNode = ret var buf int = 0 for l1Tmp != nil && l2Tmp != nil { retTail.Val = l1Tmp.Val + l2Tmp.Val if buf != 0 { retTail.Val += buf } buf = retTail.Val / 10 retTail.Val %= 10 l1Tmp = l1Tmp.Next l2Tmp = l2Tmp.Next if l1Tmp != nil || l2Tmp != nil { retTail.Next = &ListNode{-1, nil} retTail = retTail.Next } } for l1Tmp != nil { retTail.Val = l1Tmp.Val if buf != 0 { retTail.Val += buf buf = retTail.Val / 10 retTail.Val %= 10 } l1Tmp = l1Tmp.Next if l1Tmp != nil { retTail.Next = &ListNode{-1, nil} retTail = retTail.Next } } for l2Tmp != nil { if retTail == nil { retTail = &ListNode{-1, nil} } retTail.Val = l2Tmp.Val if buf != 0 { retTail.Val += buf buf = retTail.Val / 10 retTail.Val %= 10 } l2Tmp = l2Tmp.Next if l2Tmp != nil { retTail.Next = &ListNode{-1, nil} retTail = retTail.Next } } if buf != 0 { retTail.Next = &ListNode{buf, nil} retTail = retTail.Next } return ret } func arrayToListNode(l []int) *ListNode { var i int = 0 var res ListNode = ListNode{l[i], nil} var tmp *ListNode = &res i++ for ; i < len(l); i++ { tmp.Next = &ListNode{l[i], nil} tmp = tmp.Next } return &res } func main() { // tmp11 := ListNode{3, nil} // tmp12 := ListNode{4, &tmp11} // var l1 ListNode = ListNode{2, &tmp12} var l1 *ListNode = arrayToListNode([]int{0}) fmt.Printf("l1 => ") l1.Print() var l2 *ListNode = arrayToListNode([]int{2, 7, 8}) fmt.Printf("l2 => ") l2.Print() // fmt.Printf("res => ") addTwoNumbers(l1, l2).Print() }