后来又重新整理了,与(1)中相比,(1)中只有两个循环,但是(2)中有三个三循环,因此时间也从22ms变了28ms.
但是(2)相比(1)节省了空间,特别是在这个两个数的位数很大,且两个数的位数很近的时候。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* sumNode=NULL; //Use struct to define the variable
struct ListNode* head=NULL;
struct ListNode* one=l1;
struct ListNode* two=l2;
struct ListNode* list=NULL;
struct ListNode* another=NULL;
if(l1==NULL && l2==NULL)
{
return two;
}
else if(l1==NULL)
{
return l2;
}
else if(l2==NULL)
{
return l1;
}
else //two lists are not NULL
{
//Find which list is longer
//set list to the shorter list
while(one!=NULL && two!=NULL)
{
one=one->next;
two=two->next;
}
if(one!=NULL)
{
list=l2; //shouldn't set to two
another=l1;
}
else
{
list=l1;
another=l2;
}
struct ListNode* pre;
int num=0;
while(list!=NULL)
{
if(head==NULL)
{
head=another;
}
int sum=list->val+another->val+num;
num=0;
if(sum<10)
{
another->val=sum;
}
else
{
int remain=sum%10;
num=sum/10;
another->val=remain;
}
pre=another;
list=list->next;
another=another->next;
}
while(num!=0 && another!=NULL)
{
int sum=another->val+num;
num=0;
if(sum<10)
{
another->val=sum;
}
else
{
int remain=sum%10;
num=sum/10;
another->val=remain;
}
pre=another;
another=another->next;
}
if(num!=0 && another==NULL)
{
sumNode=(struct ListNode*)malloc(sizeof(struct ListNode*));
sumNode->val=num;
sumNode->next=NULL;
pre->next=sumNode;
}
}
return head;
}