假定用一个链表表示两个数,其中每个节点仅包含一个数字。假设这两个数的数字顺序
排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式。
样例
给出 6->1->7
+ 2->9->5
。即,617 + 295
。
返回 9->1->2
。即,912
。
解题思路:
可以先翻转链表得到倒序链表,然后按照Lintcode 167:Add Two Numbers思路即可。但是这样太简单了,如果题目不允许对原链表有修改的话,可以使用辅助数据结构栈来帮助操作:
先将两个链表依次按位压入各自的栈中,然后依次每个栈中的top()值相加,再将结果新建一个节点,链接在头节点即可。
/**
* Definition of singly-linked-list:
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param l1: The first list.
* @param l2: The second list.
* @return: the sum list of l1 and l2.
*/
ListNode * addLists2(ListNode * l1, ListNode * l2)
{
// write your code here
ListNode * resList = new ListNode(0);
ListNode * cur = resList;
stack<int> s1;
stack<int> s2;
int cnt = 0;
while(l1 != NULL)
{
s1.push(l1->val);
l1 = l1->next;
}
while(l2 != NULL)
{
s2.push(l2->val);
l2 = l2->next;
}
while(!s1.empty() || !s2.empty())
{
int resNum;
if(!s1.empty() && !s2.empty())
resNum = s1.top() + s2.top() + cnt;
else if(!s1.empty())
resNum = s1.top() + cnt;
else
resNum = s2.top() + cnt;
//在链表头插入新节点
ListNode * newNode = new ListNode(resNum%10);
newNode->next = cur->next;
cur->next = newNode;
cnt = resNum / 10;
if(!s1.empty())
s1.pop();
if(!s2.empty())
s2.pop();
}
if(cnt)
{
ListNode * newNode = new ListNode(cnt);
newNode->next = cur->next;
cur->next = newNode;
}
return resList->next;
}
};