第二题,两个链表 ,思路很清晰,从头相加,如果res>10,此位留res%10,下一位res则需要加1,以此类推。
1、但是有许多细节需要考虑,比如长度不一样?需要怎么处理?变为0?
2、最后一个相加>10,需要开辟新的空间存储额外的1。
3、 嗯。。思路很简单 ,但是代码不会写。。。
4、参考了别人的代码,自己做详细的注释。大体思路是采用双指针。
class Solution{
public:
ListNode* addTwoNumbers(ListNode* l1,ListNode* l2)
{
ListNode *head = nullptr, *tail = nullptr;//定义头尾指针
int carry = 0;//进位默认为0
while(l1||l2)//l1或l2有不为0
{
int n1 = l1? l1->val:0;// 判断l1是否为空,如果不为空 n1=l1的第一位 ;如果为空,n1=0;下同
int n2 = l2? l2->val:0;
int sum = n1 + n2 + carry;//求n1、n2和
if(!head)//头指针为空,第一个循环进入这个
{
head = tail = new ListNode(sum % 10);//头尾指针的值都是sum%10;
}
//当进入第二个循环后,由于头指针一直不为空,故循环一直在else这部分
else{
tail->next = new ListNode(sum % 10);//尾指针的下一个为当前sum%10(当前sum为下一轮的sum,一个指向下一位,一个是下一位的值。。)
tail = tail->next;//把尾指针指向下一位,这样尾指针就连续起来了
}
carry = sum/10;//求进位
if(l1)//l1不为空
{
l1 = l1->next;取l1的下一位;下同
}
if(l2)
{
l2 = l2->next;
}
}
if(carry > 0)//循环结束后,判断进位是否>0?
{
tail->next = new ListNode(carry);大于0,尾指针向后进一步,创建一个值为1的节点。
}
return head;//返回头指针即可得到结果
}
};