Example
Given 6->1->7 + 2->9->5. That is, 617 + 295.
Return 9->1->2. That is, 912.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/**
* @param l1: the first list
* @param l2: the second list
* @return: the sum list of l1 and l2
*/
void ListReverse(ListNode*& list) //List Reverse
{
if (list == NULL || list->next == NULL) //特殊情况
return;
ListNode* prev = list, *p = list->next, *pnext = p->next; // 记录三个节点的位置
prev->next = NULL;
while (p != NULL)
{
pnext = p->next; //记录下一位置
p->next = prev; //指针前指
prev = p;
p = pnext; // 下一位置继续循环
}
list = prev; // 首节点为原来的尾节点
}
ListNode* Add(ListNode* l1, ListNode* l2)
{
ListNode* sum = NULL, *p1 = NULL, *pf = sum;
// 先把所有的对应位置都进行相加 保存到sum 中
while (l1 != NULL && l2 != NULL)
{
if (sum == NULL)
{
sum = new ListNode(l1->val + l2->val);
pf = sum;
}
else
{
pf->next = new ListNode(l1->val + l2->val);
pf = pf->next;
}
l1 = l1->next;
l2 = l2->next;
}
while (l1 != NULL)
{
if (sum == NULL) //sum is Null, sum = new listnode
{
sum = new ListNode(l1->val);
pf = sum;
}
else
{
pf->next = new ListNode(l1->val);
pf = pf->next;
}
l1 = l1->next;
}
while (l2 != NULL)
{
if (sum == NULL)
{
sum = new ListNode(l2->val);
pf = sum;
}
else
{
pf->next = new ListNode(l2->val);
pf = pf->next;
}
l2 = l2->next;
}
p1 = sum;
bool flag = false; //进位记录
while (p1 != NULL)
{
if (flag == true)
p1->val++;
if (p1->val >= 10)
{
flag = true;
p1->val -= 10;
}
else
flag = false;
if (flag == true && p1->next == NULL)
{
p1->next = new ListNode(1);
flag = false;
}
p1 = p1->next;
}
return sum;
}
ListNode *addLists2(ListNode *l1, ListNode *l2) {
// write your code here
ListReverse(l1);
ListReverse(l2);
ListNode* out = Add(l1, l2);
ListReverse(out);
return out;
}
};