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.
Example:
Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 8 -> 0 -> 7
Subscribe to see which companies asked this question.
将两个链表相加,得到一个结果链表。最好是不要改变原来的链表,也就是不要倒转原链表。因为要从链表的尾部开始计算,所以用栈实现比较方便。每次的结果存放在一个新的链表节点上,然后连接起来。注意进位的问题。
代码:
class Solution
{
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode* h1 = l1, * h2 = l2;
stack<int> s1, s2;
while(h1)
{
s1.push(h1->val);
h1 = h1->next;
}
while(h2)
{
s2.push(h2->val);
h2 = h2->next;
}
if(s1.size() < s2.size()) swap(s1, s2);
ListNode* head = NULL;
int r = 0;
while(!s1.empty() && !s2.empty())
{
int sum = (s1.top() + s2.top() + r) % 10;
r = (s1.top() + s2.top() + r) / 10;
s1.pop(); s2.pop();
ListNode* p = new ListNode(sum);
p->next = head;
head = p;
}
while(!s1.empty())
{
int sum = (s1.top() + r) % 10;
r = (s1.top() + r) / 10;
s1.pop();
ListNode* p = new ListNode(sum);
p->next = head;
head = p;
}
if(r > 0)
{
ListNode* p = new ListNode(r);
p->next = head;
head = p;
}
return head;
}
};