#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
#define bool int
#define true 1
#define false 0
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* result=(struct ListNode*)malloc(sizeof(struct ListNode));
result->next=NULL;
struct ListNode* nodePointer=result;
int lastRem=0;
while(l1!=NULL||l2!=NULL||lastRem>0){
int tempSum=lastRem;
if(l1==NULL&&l2==NULL){
if(lastRem>0){
nodePointer->val=lastRem;
}
break;
}
if(l1!=NULL&&l2==NULL){
tempSum+=l1->val;
if(tempSum<10){
nodePointer->val=tempSum;
nodePointer->next=l1->next;
break;
}
}
if(l1==NULL&&l2!=NULL){
tempSum+=l2->val;
//优化
if(tempSum<10){
nodePointer->val=tempSum;
nodePointer->next=l2->next;
break;
}
}
if(l1!=NULL&&l2!=NULL){
tempSum+=(l1->val+l2->val);
}
if(tempSum>=10){
nodePointer->val=tempSum-10;
lastRem=1;
}else{
lastRem=0;
nodePointer->val=tempSum;
}
bool pointerNeedFlow=false;
if(l1!=NULL){
pointerNeedFlow=l1->next!=NULL;
l1=l1->next;
}
if(l2!=NULL){
if(!pointerNeedFlow){
pointerNeedFlow=l2->next!=NULL;
}
l2=l2->next;
}
if(pointerNeedFlow||lastRem>0){
struct ListNode* newNode=(struct ListNode*)malloc(sizeof(struct ListNode));;
newNode->val=-1;
newNode->next=NULL;
nodePointer->next=newNode;
nodePointer=newNode;
}
}
return result;
}
//just support num in str
struct ListNode* make_nodes(const char* str){
struct ListNode* result=(struct ListNode*)malloc(sizeof(struct ListNode));
result->next=NULL;
struct ListNode* pointer=result;
int len=strlen(str);
for(int i=0;i<len;i++){
pointer->val=(char)str[i]-48;
if(i<len-1){
struct ListNode* newNode=(struct ListNode*)malloc(sizeof(struct ListNode));
newNode->next=NULL;
pointer->next=newNode;
pointer=newNode;
//printf("%c",str[i]);
}
}
//printf("\n");
return result;
}
void print_nodes(struct ListNode* root){
if(root!=NULL){
printf("%d->",root->val);
print_nodes(root->next);
}else{
printf("NULL\n");
}
}
int main(){
struct ListNode* l1=make_nodes("98");
print_nodes(l1);
struct ListNode* l2=make_nodes("1");
print_nodes(l2);
struct ListNode* result=addTwoNumbers(l1,l2);
print_nodes(result);
return 0;
}
2. 两数相加
最新推荐文章于 2022-10-05 14:34:50 发布