三栈数据结构,不精简了,方便阅读
public ListNode addInList(ListNode head1, ListNode head2) {
        // write code here
        if (head1 == null) {
            return head2;
        } else if (head2 == null) {
            return head1;
        }
        Stack<Integer> stack1 = new Stack<>();
        Stack<Integer> stack2 = new Stack<>();
        Stack<Integer> res = new Stack<>();
        while (head1 != null) {
            stack1.push(head1.val);
            head1 = head1.next;
        }
        while (head2 != null) {
            stack2.push(head2.val);
            head2 = head2.next;
        }
        ListNode sentinel = new ListNode(-1);
        ListNode cur = sentinel;
        int carry = 0;
        while (!stack1.isEmpty() && !stack2.isEmpty()) {
            int temp = carry + stack1.pop() + stack2.pop();
            if (temp >= 10) {
                carry = 1;
                res.push(temp % 10);
            } else {
                carry = 0;
                res.push(temp);
            }
        }
        while (!stack1.isEmpty()) {
            int temp = carry + stack1.pop();
            if (temp >= 10) {
                carry = 1;
                res.push(temp % 10);
            } else {
                carry = 0;
                res.push(temp);
            }
        }
        while (!stack2.isEmpty()) {
            int temp = carry + stack2.pop();
            if (temp >= 10) {
                carry = 1;
                res.push(temp % 10);
            } else {
                carry = 0;
                res.push(temp);
            }
        }
        while (!res.isEmpty()) {
            ListNode node = new ListNode(res.pop());
            cur.next = node;
            cur = cur.next;
        }
        return sentinel.next;
    }