// @leet start
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverse(head *ListNode) *ListNode {
var p1, p2, p3 *ListNode
p3 = head
for p3 != nil {
p1 = p2
p2 = p3
p3 = p3.Next
p2.Next = p1
}
return p2
}
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
l1 = reverse(l1)
l2 = reverse(l2)
var ans, ans_h *ListNode
var carry int
for l1 != nil && l2 != nil {
var n ListNode
n.Val = (l1.Val + l2.Val + carry) % 10
carry = (l1.Val + l2.Val + carry) / 10
if ans == nil {
ans = &n
ans_h = ans
} else {
ans.Next = &n
ans = ans.Next
}
l1 = l1.Next
l2 = l2.Next
}
for l1 != nil {
var n ListNode
n.Val = (l1.Val + carry) % 10
carry = (l1.Val + carry) / 10
ans.Next = &n
ans = ans.Next
l1 = l1.Next
}
for l2 != nil {
var n ListNode
n.Val = (l2.Val + carry) % 10
carry = (l2.Val + carry) / 10
ans.Next = &n
ans = ans.Next
l2 = l2.Next
}
for carry != 0 {
var n ListNode
n.Val = carry % 10
carry = carry / 10
ans.Next = &n
ans = ans.Next
}
ans = reverse(ans_h)
return ans
}
// @leet end