/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
#include <stdlib.h>
struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) {
// write code here
if (head1->next == NULL && head2->next == NULL) { // 两个一位数相加
head1->val = head1->val + head2->val;
if (head1->val >= 10) { // 需要进位
head1->val = head1->val - 10;
struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->val = 1;
p->next = head1; // 头插法
head1->next = NULL;
return p;
} else { // 不需要进位
return head1;
}
}
struct ListNode* L1 = (struct ListNode*)malloc(sizeof(struct ListNode));
L1->next = NULL;
while (head1 != NULL) { // 新建L1储存head1的翻转,L1带头结点
struct ListNode* tmp = (struct ListNode*)malloc(sizeof(struct ListNode));
tmp->val = head1->val;
tmp->next = L1->next;
L1->next = tmp;
head1 = head1->next;
}
struct ListNode* L2 = (struct ListNode*)malloc(sizeof(struct ListNode));
L2->next = NULL;
while (head2 != NULL) { // 新建L2储存head2的翻转,L2带头结点
struct ListNode* tmp = (struct ListNode*)malloc(sizeof(struct ListNode));
tmp->val = head2->val;
tmp->next = L2->next;
L2->next = tmp;
head2 = head2->next;
}
int jinwei = 0;
struct ListNode* L = (struct ListNode*)malloc(sizeof(struct ListNode));
L->next = NULL; // 新建L储存结果
struct ListNode* LL1 = L1->next; // LL1从L1的首元结点开始
struct ListNode* LL2 = L2->next; // LL2从L2的首元结点开始
while (LL1 != NULL && LL2 != NULL) {
struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
// 新建结点p用来存放两个结点的和
p->val = LL1->val + LL2->val + jinwei;
if (p->val >= 10) { // 两个结点的和需要进位
p->val = p->val - 10;
jinwei = 1;
LL1 = LL1->next;
LL2 = LL2->next;
} else {
jinwei = 0;
LL1 = LL1->next;
LL2 = LL2->next;
}
p->next = L->next;
L->next = p;
}
// L1和L2可能位数相同,可能L1位数更多,可能L2位数更多
if (LL1 == NULL && LL2 == NULL) { // 位数相同
if (jinwei == 0) { // 最高位不用再进一位
return L->next;
} else { // 最高位还要再进一位,新的最高位变为1
struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->val = 1;
p->next = L->next;
L->next = p;
return L->next;
}
} else if (LL1 != NULL && LL2 == NULL) { // L1比L2长
while (LL1 != NULL) {
struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->val = LL1->val + jinwei; // L1的结点和进位数相加
if (p->val >= 10) { // 还是要进位,比如9+1
p->val = p->val - 10;
jinwei = 1;
LL1 = LL1->next;
} else {
jinwei = 0;
LL1 = LL1->next;
}
p->next = L->next;
L->next = p;
}
if (jinwei == 0) { // 最高位不用进位
return L->next;
} else { // 最高位还要进位,新的最高位变为1
struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->val = 1;
p->next = L->next;
L->next = p;
return L->next;
}
} else if (LL1 == NULL && LL2 != NULL) { // L2比L1长
while (LL2 != NULL) {
struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->val = LL2->val + jinwei;
if (p->val >= 10) {
p->val = p->val - 10;
jinwei = 1;
LL2 = LL2->next;
} else {
jinwei = 0;
LL2 = LL2->next;
}
p->next = L->next;
L->next = p;
}
if (jinwei == 0) {
return L->next;
} else {
struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->val = 1;
p->next = L->next;
L->next = p;
return L->next;
}
}
return L->next;
}