力扣腾讯50题(1)- 俩数相加
欢迎来到菜鸡刷题第一天
题目:题目中要我们解决的就是每位数字的加和,而且排除0开头数字,因此我们只需要检查每位进位情况即可。
一、思路
只需要考虑每位加和以及每位进位情况,所以总共有3种情况:
- p1表长等于p2;
- p1表长大于p2;
- p1表长小于p2.
1.p1表长等于p2
if(p1!=NULL&&p2!=NULL){
p->next=(struct ListNode*)malloc(sizeof(struct ListNode));
p=p->next;
p->val=p1->val+p2->val;
p1=p1->next;
p2=p2->next;
}
2.p1表长大于p2
if(p1!=NULL){
p->next=(struct ListNode*)malloc(sizeof(struct ListNode));
p=p->next;
p->val=p1->val;
p1=p1->next;
}
2.p1表长小于p2
if(p2!=NULL){
p->next=(struct ListNode*)malloc(sizeof(struct ListNode));
p=p->next;
p->val=p2->val;
p2=p2->next;
}
二、进位处理
每位皆判断是否进位
p->next=NULL;
p=l;
while(p->next!=NULL){
p->next->val += carry_over;
if(p->next->val >= 10){
p->next->val += -10;
carry_over = 1;
}
else
carry_over=0;
p=p->next;
}
判断最高位是否进位
if(carry_over == 1){
p->next=(struct ListNode*)malloc(sizeof(struct ListNode));
p = p->next;
p->val = 1;
p->next = NULL;
}
以上就是本题思路
三、代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* p1=l1;
struct ListNode* p2=l2;
struct ListNode* l=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* p=l;
int carry_over=0;//进位项
//先创建一个链表计算每位加和
while(p1!=NULL||p2!=NULL){
if(p1!=NULL&&p2!=NULL){
p->next=(struct ListNode*)malloc(sizeof(struct ListNode));
p=p->next;
p->val=p1->val+p2->val;
p1=p1->next;
p2=p2->next;
}
else if(p1!=NULL){
p->next=(struct ListNode*)malloc(sizeof(struct ListNode));
p=p->next;
p->val=p1->val;
p1=p1->next;
}
else if(p2!=NULL){
p->next=(struct ListNode*)malloc(sizeof(struct ListNode));
p=p->next;
p->val=p2->val;
p2=p2->next;
}
}
//进位处理
p->next=NULL;
p=l;
while(p->next!=NULL){
p->next->val += carry_over;
if(p->next->val >= 10){
p->next->val += -10;
carry_over = 1;
}
else
carry_over=0;
p=p->next;
}
if(carry_over == 1){
p->next=(struct ListNode*)malloc(sizeof(struct ListNode));
p = p->next;
p->val = 1;
p->next = NULL;
}
return l->next;
}