- 先创建两个分别指向l1,l2的指针
- 以及定义len1,len2的初始长度都为1
- len为len1,len2的长度差,方便补零
- max为最大长度
struct ListNode* h1 = l1;
struct ListNode* h2 = l2;
int len1 = 1,len2 = 1,len,max;
- 再从l1,l2里面统计最大长度,并将最大长度赋值给max
while(h1->next){
len1++;
h1 = h1->next;
}
while(h2->next){
len2++;
h2 = h2->next;
}
max = len1>len2?len1:len2;
- 为短的一条补零,使得两链表长度一致
if(len1>len2){
len = len1 - len2 ;
while(len != 0){
struct ListNode* newNode =(struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = 0;
newNode->next = NULL;
h2->next = newNode;
h2 = h2->next;
--len;
}
}else if(len1<len2){
len = len2 - len1;
while(len != 0){
struct ListNode*newNode =(struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = 0;
newNode->next = NULL;
h1->next = newNode;
h1 = h1->next;
--len;
}
}
- 定义sum为两数相加之和
- 若sum大于10,定义s为进位标志位十位,g为个位
所以在每次相加的时候要再加上上一位的进位
h1 = l1;
h2 = l2; //将l1,l2回到原来位置
int sum = 0,s = 0,g = 0;
while(max != 0){
sum = h1->val + h2->val + s;
g = sum%10;
s = sum/10;
h1->val = g; //l1里的结点存放计算结果
h1 = h1->next;
h2 = h2->next;
max--;
}
- 当最后一位如果要进位的话要再为最后一位申请内存空间,并且返回l1作为结果。
if(s!=0){
h1 = l1;
while(h1->next){
h1 = h1->next;
}
struct ListNode*newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = s;
newNode->next = NULL;
h1->next = newNode;
h1 = h1->next;
}
return l1;
}
虽然这个的内存消耗挺高的,但是我觉得这个还是比较好理解的。