第一个是测试用例代码,测试的是两个带头的逆序链表相加,并且有反转操作
但是题目要求的是不带头链表直接相加,不需要逆转,输出结果也是逆序的,
题解放在第二个代码中
#include<stdio.h>
#include<stdlib.h>
typedef struct ListNode {
int val;
struct ListNode* next;
}List;
List* reverse(List* L) {
List* p = L;
List* q = NULL;
while (p != NULL) {
List* temp = p->next;
p->next = q;
q = p;
p = temp;
}
List* head = (List*)(malloc)(sizeof(List));
head->next = q;
List* temp = head;
while (temp->next->next != NULL) {
temp = temp->next;
}
temp->next = NULL;
return head;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
List*L1=reverse(l1);
L1->val = 0;
List*L2=reverse(l2);
L2->val = 0;
List* L3 = (List*)(malloc)(sizeof(List));
L3->next = NULL;
L3->val = 0;
int flag = 0;
while (L1 != NULL || L2 != NULL) {
List* temp = (List*)(malloc)(sizeof(List));
temp->next = NULL;
temp->val = 0;
if (L1) {
temp->val += L1->val;
L1 = L1->next;
}
if (L2) {
temp->val += L2->val;
L2 = L2->next;
}
if (flag == 1) {
temp->val += 1;
flag = 0;
}//进位
if (temp->val >= 10) {
temp->val= temp->val % 10;
flag = 1;
}//大于10进位
List* cur = L3;
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = temp;
if (L1 == NULL && L2 == NULL && flag == 1) {
List* digital = (List*)(malloc)(sizeof(List));
digital->val = 1;
digital->next = NULL;
temp->next = digital;
}
}
L3->next->val = 0;
return reverse(L3->next);
}
List* makeList() {
List* L = (List*)(malloc)(sizeof(List));
L->next = NULL;
int num;
while (1) {
scanf("%d", &num);
if (num == 0) {
break;
}
List* temp = (List*)(malloc)(sizeof(List));
temp->next = NULL;
temp->val = num;
List* p = L;
while (p->next != NULL) {
p = p->next;
}
p->next = temp;
}
return L;
}
void print_List(List* L) {
L = L->next; // 跳过头节点
while (L != NULL) {
printf("%d ", L->val);
L = L->next;
}
printf("\n");
}
int main() {
List* L1 = makeList();
printf("打印L1\n");
print_List(L1);
List* L3=reverse(L1);
List* L2= makeList();
printf("打印L2\n");
print_List(L2);
List* L4 = reverse(L2);
printf("打印L3\n");
print_List(L3);
printf("打印L4\n");
print_List(L4);
List* L5 = addTwoNumbers(L3, L4);
printf("打印L5\n");
print_List(L5);
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* L3 = (struct ListNode*)(malloc)(sizeof(struct ListNode));
L3->next = NULL;
L3->val=0;
int flag = 0;
while (l1 != NULL || l2 != NULL) {
struct ListNode* temp = (struct ListNode*)(malloc)(sizeof(struct ListNode));
temp->next = NULL;
temp->val = 0;
if (l1) {
temp->val += l1->val;
l1 = l1->next;
}
if (l2) {
temp->val += l2->val;
l2 = l2->next;
}
if (flag == 1) {
temp->val += 1;
flag = 0;
}//进位
if (temp->val >= 10) {
temp->val= temp->val % 10;
flag = 1;
}//大于10进位
struct ListNode* cur = L3;
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = temp;
if (l1 == NULL && l2 == NULL && flag == 1) {
struct ListNode* digital = (struct ListNode*)(malloc)(sizeof(struct ListNode));
digital->val = 1;
digital->next = NULL;
temp->next = digital;
}
}
return (L3->next);
}