第二题
第二题思考了下,有了大致思路
因为在链表中是逆序排放,所以链表的头节点代表的是这两个数的最低位,所以可以分为len1>len2和其他情况,len1>len2时应当考虑每个节点的值相加时会不会进位的问题,如果不进位,就非常好办,直接相加即可,但如果进位的话,就需要考虑在l1的下一个节点的值+1的问题,如果l1的下一个节点为9,则需要在其下一个的下一个节点+1,如果下一个的下一个节点为空,则需要建立节点,并赋值为1.
因为太久没用链表,所以刚开始出现了直接.调用next和val的情况,后来报错便改正,推荐使用CTRL+H来进行替换成->。
指针遍历完后就会改变位置,所以需要保留原指针,申请两个新指针进行赋值,单链表到了末尾貌似就返回不了了,除非搞成循环。
附一个思路和俺一样的正确答案。
/**
* 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 len1=1;//记录l1的长度
int len2=1;//记录l2的长度
ListNode* p=l1;
ListNode* q=l2;
while(p->next!=NULL)//获取l1的长度
{
len1++;
p=p->next;
}
while(q->next!=NULL)//获取l2的长度
{
len2++;
q=q->next;
}
if(len1>len2)//l1较长,在l2末尾补零
{
for(int i=1;i<=len1-len2;i++)
{
q->next=new ListNode(0);
q=q->next;
}
}
else//l2较长,在l1末尾补零
{
for(int i=1;i<=len2-len1;i++)
{
p->next=new ListNode(0);
p=p->next;
}
}
p=l1;
q=l2;
bool count=false;//记录进位
ListNode* l3=new ListNode(-1);//存放结果的链表
ListNode* w=l3;//l3的移动指针
int i=0;//记录相加结果
while(p!=NULL&&q!=NULL)
{
i=count+p->val+q->val;
w->next=new ListNode(i%10);
count=i>=10?true:false;
w=w->next;
p=p->next;
q=q->next;
}
if(count)//若最后还有进位
{
w->next=new ListNode(1);
w=w->next;
}
return l3->next;
}
};
作者:chenlele
链接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-gpe3dbjds1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
继续冲!!