blog

博客

View on GitHub

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

你可以假设除了数字 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
}