import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head1 ListNode类
     * @param head2 ListNode类
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        // write code here
        // 解题思路:
        // 1.如果head1 为null,则返回head2,反之也是。
        // 2.对head1 和 head2 进行链表反转
        // 3.循环遍历  head1 不为null或head2 不为null,则取他们的值相加
        // 对10取余作为新节点的值,对10取整作为下一次计算的初始值
        // 向后移动链表
        // 跳出循环后,需要注意初始值是否大于0
        // 最后对新链表反转
        if (head1 == null) {
            return head2;
        }

        if (head2 == null) {
            return head1;
        }

        ListNode r1 = reverse( head1);
        ListNode r2 = reverse( head2);
        int temp = 0;

        ListNode root = new ListNode(-1);
        ListNode cur = root;

        while (r1 != null || r2 != null) {
            int v1 = (r1 == null) ? 0 : r1.val;
            int v2 = (r2 == null) ? 0 : r2.val;

            int sum = temp + v1 + v2;
            temp = sum / 10;
            cur.next = new ListNode(sum % 10);
            cur = cur.next;

            if (r1 != null) {
                r1 = r1.next;
            }

            if (r2 != null) {
                r2 = r2.next;
            }

        }

        if (temp > 0) {
            cur.next = new ListNode(temp);
        }

        return reverse(root.next);
    }

    private ListNode reverse(ListNode head1) {
        if (head1 == null) {
            return null;
        }

        ListNode pre = null;
        ListNode next;

        while (head1 != null) {
            next = head1.next;
            head1.next = pre;
            pre = head1;
            head1 = next;
        }

        return pre;
    }
}