题面:
You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.
Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 8 -> 0 -> 7
解题思路:
刚看到题目首先想到的是将链表直接转换成int型,然后用内置类型的加法后再重新生成一条结果链表,但是这样做没有锻炼到关于指针的使用能力,所以还是老老实实地用竖式计算的思想来完成。
因为竖式计算需要将两个加数右对齐,但是题目不允许将链表翻转,所以我们只能利用栈的FILO的特性,将链表的每个结点压栈,最后,只需要一些简单的指针操作就能完成结果链表的生成。
代码如下:
/**
* 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> s1, s2;
while (l1 != NULL) {
s1.push(l1->val);
l1 = l1->next;
}
while (l2 != NULL) {
s2.push(l2->val);
l2 = l2->next;
}
int carry = 0;
ListNode* result = NULL;
while (!s1.empty() && !s2.empty()) {
int value = s1.top() + s2.top() + carry;
carry = value > 9? 1 : 0;
ListNode* temp = new ListNode(value % 10);
temp->next = result;
result = temp;
s1.pop(); s2.pop();
}
stack<int> &s = s1.empty()? s2 : s1;
while (!s.empty()) {
int value = s.top() + carry;
carry = value > 9? 1 : 0;
ListNode* temp = new ListNode(value % 10);
temp->next = result;
result = temp;
s.pop();
}
if (carry == 1) {
ListNode* temp = new ListNode(carry);
temp->next = result;
result = temp;
}
return result;
}
};