题意:2个链表内容相加,链表数据均为个位数,如果相加超过10,则取余,同时下一节点值进1
此题就是要懂得处理特殊情况,如下:
1. 刚输入的l1、l2头节点有可能是空的
2.l1和l2的长度可能不相等
3.l1比l2长,同时l1的后半段一直是9,即后方会不断进1
4. l1和l2即使都遍历结束了,但因为最后节点相加大于10,故应该再新增加一个节点!
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
int sum,add_num=0,num1,num2;
struct ListNode *p1,*p2,*l3,*p3;
l3=(struct ListNode *)malloc(sizeof(struct ListNode));
p3=l3;
p1=l1;p2=l2;
if(l1==NULL) //这段预防刚输入的l1、l2就是空的
return l2;
else if(l2==NULL)
return l1;
while(1)
{
//如果为空,则置0,否则置其val,处理有一段链表到头了,另一段没到头
if(p1==NULL)
num1=0;
else num1=p1->val;
if(p2==NULL)
num2=0;
else num2=p2->val;
//相加,取余处理,增值处理
sum=num1+num2+add_num;
p3->val=sum%10;
add_num=sum/10;
//如果已经是空了,就不继续向下,一样用于处理某链表到头情况
if(p1!=NULL)
p1=p1->next;
if(p2!=NULL)
p2=p2->next;
//当二者一起到头时,说明要结束计算了
if(p1==NULL&&p2==NULL)
{
//查看增值是否为1,若是,还需要在尾端加一个节点,值为1
if(add_num==1)
{
p3->next=(struct ListNode *)malloc(sizeof(struct ListNode));
p3->next->val=add_num;
p3->next->next=NULL; //记住,尾节点的next必须要初始化为NULL
}
else p3->next=NULL;
return l3;
}
//建立新的下一个节点,next记得先设为null
p3->next=(struct ListNode *)malloc(sizeof(struct ListNode));
p3=p3->next;
p3->next=NULL;
}
}