题目:给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。(不能对列表中的节点尽心翻转)
示例: 输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 输出: 7 -> 8 -> 0 -> 7
思路:先将两链表补齐为等长链表,再以递归方式按位进行加和。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
private:
//递归函数
void addlinklist(ListNode *s1,ListNode *s2,int *cout)
{
if(s1==NULL&&s2==NULL) return;
if(s1!=NULL&&s2!=NULL) addlinklist(s1->next,s2->next,cout);
int sum=s1->val+s2->val+*cout;
if(sum>=10)
{*cout=1;s1->val=sum%10;}
else {*cout=0;s1->val=sum;}
return;
}
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//链表补齐
ListNode *head1=new ListNode(0);
ListNode *head2=new ListNode(0);
head1->next=l1;
head2->next=l2;
ListNode *p1=head1;
ListNode *p2=head2;
while(p1!=NULL&&p2!=NULL)
{
p1=p1->next;
p2=p2->next;
}
if(p1==NULL)
{
while(p2!=NULL)
{
ListNode *temp=new ListNode(0);
temp->next=head1->next;
head1->next=temp;
p2=p2->next;
}
}
if(p2==NULL)
{
while(p1!=NULL)
{
ListNode *temp=new ListNode(0);
temp->next=head2->next;
head2->next=temp;
p1=p1->next;
}
}
int *cout=new int(0);
addlinklist(head1,head2,cout);
if(head1->val==0) return head1->next;
else return head1;
}
};