给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 输出: 7 -> 8 -> 0 -> 7
观察给的样例输出,有进位且类似链表的逆序相加再逆序输出,受此启发可以用两个栈来实现first,second,第一次遍历把第一个链表的数放入first,第二个链表的数放入second。然后从first和second不断取数逆序构造链表即可,注意进位问题。
程序如下:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { if (!l1 && !l2) { return l1; } if (!l1 && l2) { return l2; } if (l1 && !l2) { return l1; } stack<ListNode*> first; stack<ListNode*> second; while (l1 || l2) { if (l1) { first.push(l1); l1 = l1->next; } if (l2) { second.push(l2); l2 = l2->next; } } ListNode* node_next = nullptr; ListNode* node = nullptr; int carry = 0; while (!first.empty() || !second.empty() || carry) { int sum = ((!first.empty())? first.top()->val:0) + ((!second.empty()) ? second.top()->val : 0) + carry; node = new ListNode(sum % 10); node->next = node_next; node_next = node; if (!first.empty()) { first.pop(); } if (!second.empty()) { second.pop(); } carry = sum / 10; } return node; }