221.假定用一个链表表示两个数,其中每个节点仅包含一个数字。假设这两个数的数字顺序排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式。
对于这道题,可以先把两个链表翻转,再依次相加,再把相加的结果再次翻转。
/**
* 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.
*/
ListNode * addLists2(ListNode * l1, ListNode * l2) {
if(!l1&&!l2)
return NULL;
ListNode *head = new ListNode;
ListNode *tail = head;
ListNode *p1 = reverse(l1);//翻转链表l1
ListNode *p2 = reverse(l2);//翻转链表l2
head->next = NULL;
int val1,val2;
int flag = 0;
while(p1||p2)//翻转后的链表元素依次相加
{
if(p1)
{
val1 = p1->val;
p1 = p1->next;
}
else
val1 = 0;
if(p2)
{
val2 = p2->val;
p2 = p2->next;
}
else
val2 = 0;
int temp = flag+val1+val2;
flag = temp/10;
temp = temp%10;
ListNode *pTest = new ListNode;
pTest->val = temp;
pTest->next = NULL;
tail->next = pTest;
tail = tail->next;
}
if(flag)
{
ListNode *pTest = new ListNode;
pTest->val = flag;
pTest->next = NULL;
tail->next = pTest;
}
tail = head;
head = head->next;
delete tail;
return reverse(head);//翻转计算结果
}
ListNode * reverse(ListNode *head)//翻转链表
{
ListNode *p = new ListNode;
ListNode *temp = NULL;
p->next = NULL;
temp = head;
head = p;
p = temp;
while(p)
{
temp = p;
p = p->next;
temp->next = head->next;
head->next = temp;
}
temp = head;
head = head->next;
return head;
}
};