给定两个非空链表来代表两个非负数,位数按照逆序方式存储,它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
package main
func main() {
var h, h2 ListNode
arr := []int{2, 4, 3}
h.Val = arr[0]
arr2 := []int{5, 6, 4}
h2.Val = arr2[0]
//往链表插入元素
for i := 1; i < len(arr); i++ {
var d ListNode
d.Val = arr[i]
Insert(&h, &d, i)
}
for i := 1; i < len(arr2); i++ {
var d2 ListNode
d2.Val = arr2[i]
Insert(&h2, &d2, i)
}
addTwoNumbers(&h, &h2)
}
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
nl := ListNode{}
carry := 0
qnl := &nl
for l1 != nil || l2 != nil || carry != 0 {
d := ListNode{}
l1val := 0
l2val := 0
if l1 != nil {
l1val = l1.Val
l1 = l1.Next
}
if l2 != nil {
l2val = l2.Val
l2 = l2.Next
}
val := l1val + l2val + carry
carry = val / 10
qnl.Val = val % 10
if l1 != nil || l2 != nil || carry != 0 {
qnl.Next = &d
qnl = qnl.Next
}
}
return &nl
}
//插入一个节点
//h: 头结点
//d:要插入的节点
//p:要插入的位置
func Insert(h, d *ListNode, p int) bool {
if h.Next == nil {
h.Next = d
return true
}
n := h
for i := 0; n.Next != nil; i++ {
if i == p {
if n.Next.Next == nil {
n.Next = d
return true
} else {
d.Next = n.Next
n.Next = d.Next
return true
}
}
n = n.Next
if n.Next == nil {
n.Next = d
return true
}
}
return false
}