You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
思路:
刚看到这个题的时候,写着中等难度,第一眼感觉,这不就是类似于多项式想加么,于是就直接写了一个简单的想加算法,没有考虑过链表会是什么形式,然后提交的时候输出答案是对的,但是确认答案的时候系统出了不同的链表测试算法,该算法就不合适了,各种BUG。。。。
也就是说链表相加会出现以下情况:
1、 (9)+(9)=(8,1);即多出一个节点
2、(9,9)+(9)=(8,0,1),多出一个节点或者N个节点
于是有了些想法,第一种,就是给每个链表添加计数flag1,flag2,然后把两个链表补齐,例如(2->4)+(2->3->4),则(2->4)补齐为(2->4->0),但是问题就是,要是计算量过大,要补齐其中一条链表,那就回很废内存,不是一个明智的做法。
第二种想法,是通过把第二条链表加到第一条链表,若第二条链表尾指针为NULL,则想加结束,一些例子想加成功了,但是一些却在相加的过程中进1出现了问题….正在调试中ORZ 。
(后面在代码中添加了一个 if_gonext,判断指向L1链表的指针r1是否向下一个节点走,因为在下面代码中,在相加系数的时候我没有将r1指针指向下一个节点,只把r2指针指向下一个节点,r1指向下一个节点的操作在while(r1->val>=10)这个循环中进行,若r1->val<10的时候,指针就不移动了,所以增添了一个bool值去判断)
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int f1=0,f2=0;
auto r1=l1;//指向l1链表
auto r2=l2;//指向l2链表
auto temp=l2;//用于删除l2链表的空余节点
int add=0;//进一位的计数
bool if_gonext;//r1是否去下一个节点
while(r2!=NULL)
{
if_gonext=true;
if(f1==f2)
{
r1->val+=r2->val;
r2=r2->next;
f2++;
delete temp;
temp=r2;
}
else if(f1<f2)
{
r1->next=r2;
r1=r1->next;
r2=r2->next;
f1++;
f2++;
break;
}
r1->val+=add;
add=0;
while(r1->val>=10)
{
if_gonext=false;
r1->val%=10;
++add;
if(r1->next==NULL)
{
auto node=new ListNode(add);
r1->next=node;
r1=r1->next;
f1++;
add=0;
}
else
{
r1=r1->next;
r1->val+=add;
f1++;
add=0;
if(f1>=f2&&r2!=NULL)
break;
}
}
if (r1->next != NULL&&if_gonext==true)
{
r1 = r1->next;
f1++;
}
if(r2==NULL)
{
delete r2;
r2=NULL;
}
}
return l1;
}
};