#include<stdio h=""> #include<stdlib h=""> #include<string h=""> #include<time h=""> #include <windows h=""> #pragma warning(disable:4996) struct ListNode { int val; struct ListNode *next; }; struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { struct ListNode* l3, *pnew, *tail; l3 = (ListNode *)malloc(sizeof(ListNode));//创建头节点。 int tmp = 0; if (l3 == NULL) { //创建失败返回 printf("创建失败!"); return NULL; } l3->next = NULL; //头节点指针域置NULL tail = l3; // 开始时尾指针指向头节点 将新建的头节点当做最后一个节点 while ((l1->next != NULL) || (l2->next != NULL) || (tmp != 0)) { //创建链表 pnew = (ListNode *)malloc(sizeof(ListNode)); //创建新节点 if (pnew == NULL) { //创建失败返回 printf("创建失败!"); return NULL; } if ((l1->next != NULL) || (l2->next != NULL)) { if ((l1->next != NULL) && (l2->next == NULL)) { pnew->val = l1->next->val + tmp; tmp = 0; } else if ((l2->next != NULL) && (l1->next == NULL)) { pnew->val = l2->next->val + tmp; tmp = 0; } else { pnew->val = l1->next->val + l2->next->val + tmp; tmp = 0; } /*****************解决向前进位的问题***************/ if (pnew->val >= 10) { pnew->val = pnew->val - 10; tmp = 1; } } /*********解决最后一个节点进位的问题*********/ if ((l1->next == NULL) && (l2->next == NULL) && (tmp != 0)) { pnew->val = 1; tmp = 0; } pnew->next = NULL; //新节点指针域置NULL 当前新建的节点的指针域指向NULL tail->next = pnew; //新节点插入到表尾 上一个节点的指针域指向当前新建的节点 tail = pnew; //为指针指向当前的尾节点,将当前新建的节点当做最后一个节点 /*******************解决两个链表节点不一样长的问题***************/ if ((l2->next == NULL) && (l1->next != NULL)) { l2 = l2; l1 = l1->next; } else if ((l2->next != NULL) && (l1->next == NULL)) { l2 = l2->next; l1 = l1; } else if((l2->next != NULL) && (l1->next != NULL)) { l1 = l1->next; l2 = l2->next; } else { l1 = l1; l2 = l2; } } return l3; } int main(void) { struct ListNode *l1; struct ListNode *l2, *l3; ListNode *tail1, *pnew1; ListNode *tail2, *pnew2; int i = 0; int j = 0; l1 = (ListNode *)malloc(sizeof(ListNode));//创建头节点。 l2 = (ListNode *)malloc(sizeof(ListNode));//创建头节点。 int nums1[2] = { 2,4 }; int nums2[3] = { 5,2,3 }; if (l1 == NULL) { //创建失败返回 printf("创建失败!"); return NULL; } l1->next = NULL; //头节点指针域置NULL tail1 = l1; // 开始时尾指针指向头节点 while (1) { //创建链表 if (i>= 2) break; pnew1 = (ListNode *)malloc(sizeof(ListNode)); //创建新节点 if (pnew1 == NULL) { //创建失败返回 printf("创建失败!"); return NULL; } pnew1->val = nums1[i]; //新节点数据域存放输入的成绩 pnew1->next = NULL; //新节点指针域置NULL tail1->next = pnew1; //新节点插入到表尾 tail1 = pnew1; //为指针指向当前的尾节点 i = i + 1; } if (l2 == NULL) { //创建失败返回 printf("创建失败!"); return NULL; } l2->next = NULL; //头节点指针域置NULL tail2 = l2; // 开始时尾指针指向头节点 while (1) { //创建链表 if (j >= 3) break; pnew2 = (ListNode *)malloc(sizeof(ListNode)); //创建新节点 if (pnew2 == NULL) { //创建失败返回 printf("创建失败!"); return NULL; } pnew2->val = nums2[j]; //新节点数据域存放输入的成绩 pnew2->next = NULL; //新节点指针域置NULL tail2->next = pnew2; //新节点插入到表尾 tail2 = pnew2; //为指针指向当前的尾节点 j = j + 1; } l3 = addTwoNumbers(l1, l2); while (l3->next != NULL) { printf("%d ", l3->next->val); l3 = l3->next; } return 0; } </windows></time></string></stdlib></stdio>