一、题目
二、思路
1、将两个链表反转,反转过程中记录链表长度;反转步骤为定义三个指针,前中后,每次往后移一个
2、交换两个反转后的链表,使链表1始终为最长的那个
3、两个链表开始相加,相加的结果放在链表1中,相加过程中用pos维护进位
4、相加完后再把链表反转回去
三、代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
ListNode* addInList(ListNode* head1, ListNode* head2) {
ListNode *pre=nullptr;
ListNode *cur=head1;
ListNode *nxt=nullptr;
int len1=0;
int len2=0;
while(cur)
{
len1++;
nxt=cur->next;
cur->next=pre;
pre=cur;
cur=nxt;
}
ListNode *first=nullptr;
ListNode *second=head2;
ListNode *third;
while(second)
{
len2++;
third=second->next;
second->next=first;
first=second;
second=third;
}
int pos=0;
//如果len1<len2,交换两个链表
if(len1<len2)
{
swap(pre,first);
}
ListNode *p=pre;
while(pre !=nullptr && first !=nullptr)
{
if((pre->val+first->val+pos)<10)
{
pre->val=pre->val+first->val+pos;
pos=0;
pre=pre->next;
first=first->next;
}
else
{
pre->val=pre->val+first->val+pos-10;
pos=1;
pre=pre->next;
first=first->next;
}
}
while(pre !=nullptr )
{
if((pre->val+pos)<10)
{
pre->val=pre->val+pos;
pos=0;
if(pre->next !=nullptr)
{
pre=pre->next;
}
else
{
break;
}
}
else
{
pre->val=pre->val+pos-10;
pos=1;
if(pre->next !=nullptr)
{
pre=pre->next;
}
else
{
break;
}
}
}
if(pos==1)
{
pre->next=new ListNode(1);
}
ListNode *n1=nullptr;
ListNode *n2=p;
ListNode *n3;
while(n2)
{
n3=n2->next;
n2->next=n1;
n1=n2;
n2=n3;
}
return n1;
}
};