leetcode 第2题【两数相加】
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
int t=0; /*储存进位数*/
struct ListNode* first=NULL; /*定义头节点*/
struct ListNode* end=NULL; /*定义尾节点*/
while(l1||l2) /*其中一个不为空*/
{
int n1= l1 ? l1->val : 0; /*三目运算符,l1不为空返回其所指的值,否则返回0*/
int n2= l2 ? l2->val : 0;
int sum=n1+n2+t;
if(!first)
{
first=end=malloc(sizeof(struct ListNode)); /*按结构体分配内存*/
end->val=sum%10;
end->next=NULL; /*这里我理解是为这个链表进行一个结尾,后面有需要还可以再分配*/
}
else
{
end->next=malloc(sizeof(struct ListNode));
end->next->val=sum%10;
end=end->next; /*结尾操作*/
}
t=sum/10; /*算进位数*/
if(l1)
{
l1=l1->next;
}
if(l2)
{
l2=l2->next;
}
}
if(t) /*官方解答这个if判断是在循环体里面,放外面也一样,缩小一下循环体*/
{
end->next=malloc(sizeof(struct ListNode));
end->next->val=t; /*这里很重要,当链表循环结束,还有进位数未放进去的时候,需要把最后一个进位数单独填入,前面则是直接加起来了*/
end->next->next=NULL; /*这里同样是对链表进行一个结尾*/
}
return first; /*返回*/
}
总结知识点:结构体定义、指针、三目运算符、循环体、链表