import java.util.Stack;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        // write code here
        if (null == head1 && null == head2) {
            return null;
        }
        if (null == head1) {
            return head2;
        }
        if (null == head2) {
            return head1;
        }
        // 具体代码实现
        // 将两个链表进行反转
        head1 = reverseList(head1);
        head2 = reverseList(head2);
        // 定义两个指针,初始时分别指向两个链表的头节点
        ListNode ln1 = head1;
        ListNode ln2 = head2;
        // 定义一个整型变量,用于存放进位
        int an = 0;
        // 定义一个整型变量,用于存放余数
        int val = 0;
        // 定义一个用于临时存储数据的整型变量
        int ts = 0;
        // 定义一个栈,用于存放最终的结果
        Stack<ListNode> result = new Stack<>();
        
        while (null != ln1 && null != ln2) {
            ts = ln1.val + ln2.val + an;
            val = ts % 10; // 余数
            an = ts / 10; // 进位
            // 这里不要贪心,还是老老实实新建一个节点吧
            result.push(new ListNode(val));
            // 指针后移一位
            ln1 = ln1.next;
            ln2 = ln2.next;
        }
        // 定义另一个指针
        ListNode ln = null != ln1 ? ln1 : (null != ln2 ? ln2 : null);
        if (null == ln) {
            // 如果都为空
            if (0 != an) {
                result.push(new ListNode(1));
            }
        }
        else {
            // 如果有一个不为空,将剩下的节点压栈
            while (null != ln) {
                ts = ln.val + an;
                val = ts % 10; // 余数
                an = ts / 10; // 进位
                result.push(new ListNode(val));
                ln = ln.next;
            }
            if (0 != an) {
                result.push(new ListNode(1));
            }
        }
        // 最终,将栈里面的节点依次弹出,就是我们想要的最终结果
        head1 = result.pop();
        ln1 = head1;
        while (!result.isEmpty()) {
            ln1.next = result.pop();
            ln1 = ln1.next;
        }
        return head1;
    }
    
    // 反转链表
    public static ListNode reverseList(ListNode head) {
        if (null == head) {
            return null;
        }
        if (null == head.next) {
            return head;
        }
        // 定义一个辅助栈
        Stack<ListNode> stack = new Stack<>();
        // 定义一个指针
        ListNode ln = head;
        // 具体代码实现
        while (null != ln) {
            stack.push(ln);
            ln = ln.next;
        }
        head = stack.pop();
        ln = head;
        while (!stack.isEmpty()) {
            ln.next = stack.pop();
            ln = ln.next;
        }
        // 别忘了,末尾置为null
        ln.next = null;
        // 返回头节点
        return head;
    }
}