package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 
 * @param head1 ListNode类 
 * @param head2 ListNode类 
 * @return ListNode类
*/
func addInList( head1 *ListNode ,  head2 *ListNode ) *ListNode {
    pHead1, pHead2 := head1, head2
	if pHead1 == nil {
		return pHead2
	}
	if pHead2 == nil {
		return pHead1
	}
	rHead1 := reserve(pHead1)
	rHead2 := reserve(pHead2)
	res := &ListNode{Val: 0}
	tmp := res
	//进位标志
	carry := 0
	//相同长度相加
	for rHead1 != nil && rHead2 != nil {
		val := rHead1.Val + rHead2.Val + carry
		tmp.Next = &ListNode{Val: val % 10}
		carry = val / 10
		tmp = tmp.Next
		rHead1 = rHead1.Next
		rHead2 = rHead2.Next
	}
	//剩余长度相加
	for rHead1 != nil {
		tmp.Next = &ListNode{Val: (rHead1.Val + carry) % 10}
		carry = (rHead1.Val + carry) / 10
		tmp = tmp.Next
		rHead1 = rHead1.Next
	}
	for rHead2 != nil {
		tmp.Next = &ListNode{Val: (rHead2.Val + carry) % 10}
		carry = (rHead2.Val + carry) / 10
		tmp = tmp.Next
		rHead2 = rHead2.Next
	}
	//进位计算
	if carry != 0 {
		tmp.Next = &ListNode{Val: carry}
	}
	result := reserve(res.Next)
	return result
}

//反转链表
func reserve(head *ListNode) *ListNode {
	res := &ListNode{Val: 0}
	for head != nil {
		tmp := head.Next
		head.Next = res.Next
		res.Next = head
		head = tmp
	}
	return res.Next
}