leetcode刷题
2.两数相加 C语言
思路:
平常我们计算相加就是先右对齐,个位和个位相加,十位和十位相加.,该进位的话依次向左进位。
现在题目给出数字的顺序是反过来的,那么我们从左边 (以左对齐) 计算,进位的话就进到相邻右边那一位,得到的就是反过来的数字,不信那个小本本试试。
下列算法的大致思路是先让L1和L2链表的元素左对齐,然后依次相加。如果有进位的话就向右进一位就行,以次计算。
提示:ListNode 的结构体
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
代码如下:
注:代码是依照官方的题解
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
//先创建链表的两个指针,head指针,tail指针
struct ListNode* head=NULL,* tail=NULL;
//定义carry来表示要进位的值
int carry=0;
//只要l1和l2都不为空时,进入while循环
while(l1||l2){
//分别取当前l1和l2链表对应结点的值,如果取完了的话就按0计算
int num1=l1? l1->val: 0;
int num2=l2? l2->val: 0;
//定义sum记录当前对应位的和,
int sum= num1 + num2 + carry;
//第一次计算进入这个if,因为表示结果的那个链表,每计算一次生成一次
if(!head){
//创建了第一个结点,这是head和tail指针都指向这个结点
head = malloc(sizeof(struct ListNode));
tail=head;
//将计算的结果存进当前结点的val中
tail->val=sum%10;
//将当前结点的next指针设置为空
tail->next=NULL;
}else{
//出克第一次的计算,其余的计算都进入这个else的代码块里
//同理,生成一个当前结点,
//并且让之前置空的tail->next指向这个新结点
tail->next=malloc(sizeof(struct ListNode));
//当前结点存放计算和值,取余是要考虑进位的可能
tail->next->val=sum%10;
tail=tail->next;
tail->next=NULL;
}
//如果相加没有进位的话,carry就是0,
//如果进位就看实际情况
carry=sum / 10;
//只要l1、l2链表都没有取到最后一个结点元素,就指向最后一个元素
if(l1){
l1=l1->next;
}
if(l2){
l2=l2->next;
}
}
//计算完l1和l2的所有数据后,如果最后一次计算有进位的话
//别忘了还有一个进位
if(carry>0){
tail->next=malloc(sizeof(struct ListNode));
tail->next->val=carry;
tail->next->next=NULL;
}
//最后返回指向结果链表的head指针
return head;
}