3月9日
解法:首先创建一个新节点作为返回链表的头节点,然后创建一个移动指针指向它,然后设置一个flag表示有无进位。采用补0的方法,让两个链表中相同位置逐个相加即可,最后链表加完之后判断flag是否为1,若为1表示有进位,则需要再添加一个节点赋值1,若为0表示无进位,直接返回即可。注意是返回头节点的下一个节点。
第一次脑残的解法:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *newHead = new ListNode(-1);
ListNode *newH = newHead;
int flag=0;
while(l1!=nullptr&&l2!=nullptr)
{
int a =l1->val+l2->val+flag;
if(a>=10)
{
newH->next = new ListNode(a%10);
flag=1;
}
else
{
newH->next=new ListNode(a);
flag=0;
}
newH=newH->next;
l1=l1->next;
l2=l2->next;
}
while(l2!=nullptr&&l1==nullptr)
{
newH->next=l2;
int a = l2->val+flag;
if(a>=10)
{
l2->val = a%10;
flag =1;
}
else
{
l2->val=a;
flag=0;
}
l2=l2->next;
newH=newH->next;
}
while(l2==nullptr&&l1!=nullptr)
{
newH->next = l1;
int a=l1->val+flag;
if(a>=10)
{
l1->val=a%10;
flag=1;
}
else
{
l1->val=a;
flag=0;
}
l1=l1->next;
newH = newH->next;
}
if(flag==1)
{
newH->next= new ListNode(1);
}
return newHead->next;
}
这个解法思路也很清晰,就是首先将两个链表对齐的部分相加,然后再将对齐之后多出来的那节直接补到最后,每部分都要判断有无进位,相当繁琐,费时。