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
}