解题思路
设置变量count和num。count表示两数相加后的进位,num为除10后的余数。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int count=0; //进位
int num; //余数
struct ListNode *head=(struct ListNode*)malloc(sizeof(struct ListNode)); //头结点
struct ListNode *tail; //指向尾结点
tail=head;
tail->next=NULL;
num=l1->val+l2->val+count; //头结点初始化
head->val=num%10;
count=num/10;
l1=l1->next;
l2=l2->next;
while(l1!=NULL&&l2!=NULL)
{
struct ListNode *p=(struct ListNode*)malloc(sizeof(struct ListNode));
num=l1->val+l2->val+count;
p->val=num%10;
p->next=NULL;
count=num/10;
l1=l1->next;
l2=l2->next;
tail->next=p;
tail=p;
}
if(l1==NULL&&l2==NULL) //链表等长
{
}
else if(l1!=NULL) //l1长,后续只要保存l1的结点
{
while(l1!=NULL)
{
struct ListNode *p=(struct ListNode*)malloc(sizeof(struct ListNode));
num=l1->val+count;
p->val=num%10;
p->next=NULL;
count=num/10;
l1=l1->next;
tail->next=p;
tail=p;
}
}
else if(l2!=NULL) l2长,后续只要保存l2的结点
{
while(l2!=NULL)
{
struct ListNode *p=(struct ListNode*)malloc(sizeof(struct ListNode));
num=l2->val+count;
p->val=num%10;
p->next=NULL;
count=num/10;
l2=l2->next;
tail->next=p;
tail=p;
}
}
if(count>=1) //进位需要新加结点
{
struct ListNode *p=(struct ListNode*)malloc(sizeof(struct ListNode));
p->val=count;
p->next=NULL;
tail->next=p;
tail=p;
}
return head;
}
碰到的错误
1.进位需要新加结点
刚开始没有考虑到,提交后报错发现。
2.执行报错
Line 70: Char 15: runtime error: member access within misaligned address 0xbebebebebebebebe for type ‘struct ListNode’, which requires 8 byte alignment (ListNode.c)
0xbebebebebebebebe: note: pointer points here
tail->next=NULL没有写导致。
总结
两数相加这道题思路并不难但是从开始写到最后提交成功还是花了一段时间,可能是单链表有段时间没用到了导致比较慢,然后题目中一些特殊情况没有考虑到,比如最后进位不为0还有新增结点。