- 两数相加 II-原地算法-链表处理
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例1:
输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]
示例2:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]
示例3:
输入:l1 = [0], l2 = [0]
输出:[0]
博主是第二次做这个题目了,说句实在的,这个题目是很不好写的,第一次博主用的数组做的,这次是用链表做的,对于这一次,结果,博主认为,这个题目一定要进行分解,从两个链表分解到一个否则,是很麻烦的,解题代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode * reverse(struct ListNode *L){
struct ListNode*head=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode*p;
head->next=NULL;
while(L){
p=L->next;
L->next=head->next;
head->next=L;
L=p;
}
return head->next;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
l1=reverse(l1);
l2=reverse(l2);
struct ListNode*re=(struct ListNode*)malloc(sizeof(struct ListNode));
re->next=l1;
struct ListNode *pre=re;
int rest=0,swap=0;
while(l1||l2){
if(l1==NULL&&l2!=NULL&&swap==0){
pre->next=l2;
l1=l2;
break;
}
if(l1&&l2){
if(l1->val+rest+l2->val<10){
l1->val=l1->val+rest+l2->val;
rest=0;
}
else{
l1->val=l1->val+rest+l2->val-10;
rest=1;
}
pre=l1;
l1=l1->next;
l2=l2->next;
}
if(l1&&l2==NULL){
break;
}
if(l1==NULL&&l2==NULL){
break;
}
}
while(l1&&rest==1){
// printf("%d ",l1->val);
if(l1->val+rest<10){
l1->val=l1->val+rest;
rest=0;
}
else{
l1->val=l1->val+rest-10;
rest=1;
}
pre=l1;
l1=l1->next;
}
if(l1==NULL&&rest!=0){
struct ListNode*p=(struct ListNode*)malloc(sizeof(struct ListNode));
p->val=1;
p->next=NULL;
pre->next=p;
}
re=reverse(re->next);
return re;
}