给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7
思路分析:对于加法,我们必须从低位到高位一位一位的对齐,并且从低位向高位运算,因为会产生进位。蛋式这是一个单向的链表,给我们造成了很大的不便。这时我们得想到一个数据结构——栈。栈具有“先进后出”的特性,所以当把两个链表分别放入栈中,每次取出栈顶,即为对齐的低位。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
stack<int> listOneStack;//储存l1各个节点的数字
stack<int> listTwoStack;//储存l2各个节点的数字
while (l1 != NULL) {//访问链1
listOneStack.push(l1->val);
l1 = l1->next;
}
while (l2 != NULL) {//访问链2
listTwoStack.push(l2->val);
l2 = l2->next;
}
ListNode *resListHead = NULL, *tempNodePtr = NULL;
int tempRes = 0;//低位向高高位的进位
while (!listOneStack.empty() && !listTwoStack.empty()) {
//获取当前两个栈的栈顶,并进行相加
tempRes += listOneStack.top() + listTwoStack.top();
listOneStack.pop();
listTwoStack.pop();
//新建节点,保存中间结果的个位,十位需要向前进位
tempNodePtr = new ListNode(tempRes % 10);
//更新头部
tempNodePtr->next = resListHead;
resListHead = tempNodePtr;
tempRes /= 10;//产生的进位
}
//下面的循环只有一个会执行
while (!listOneStack.empty()) {
tempRes += listOneStack.top();
listOneStack.pop();
//新建节点,保存中间结果的个位,十位需要向前进位
tempNodePtr = new ListNode(tempRes % 10);
//更新头部
tempNodePtr->next = resListHead;
resListHead = tempNodePtr;
tempRes /= 10;//产生的进位
}
while (!listTwoStack.empty()) {
tempRes += listTwoStack.top();
listTwoStack.pop();
//新建节点,保存中间结果的个位,十位需要向前进位
tempNodePtr = new ListNode(tempRes % 10);
//更新头部
tempNodePtr->next = resListHead;
resListHead = tempNodePtr;
tempRes /= 10;//产生的进位
}
//可能产生最高位的进位
if (tempRes > 0) {
tempNodePtr = new ListNode(tempRes);
//更新头部
tempNodePtr->next = resListHead;
resListHead = tempNodePtr;
}
return resListHead;
}
};
翻了一下4ms,都是利用两个栈来实现,代码几乎一毛一样,不知道执行时间差距为啥这么大。。。