class Solution {
 public:
  ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    stack<ListNode*> stack1;
    stack<ListNode*> stack2;
    while (l1) {
      stack1.push(l1);
      l1 = l1->next;
    }
    while (l2) {
      stack2.push(l2);
      l2 = l2->next;
    }
    ListNode* head = NULL;
    int carry = 0;
    while (carry || !stack1.empty() || !stack2.empty()) {
      if (!stack1.empty()) {
        carry += stack1.top()->val;
        stack1.pop();
      }
      if (!stack2.empty()) {
        carry += stack2.top()->val;
        stack2.pop();
      }
      ListNode* node = new ListNode(carry % 10);
      node->next = head;
      head = node;
      carry /= 10;
    }
    return head;
  }
};