思路:将两个链表分别反转,同时新建一个头结点准备链接相加后的值。
然后两个从头开始逐位相加,进位的和留下来准备并入下一个结点的计算中,剩下的值放入一个新建的结点中,并按尾插法链入新表中。
最后把链表反转。
struct ListNode* reverse(struct ListNode* head){ //反转链表的函数 if(head == NULL) return head; struct ListNode* cur = head; struct ListNode* node = NULL; struct ListNode* tmp; while(cur != NULL){ tmp = cur->next; cur->next = node; node = cur; cur = tmp; } return node; } struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { if(head1 == NULL) return head2; if(head2 == NULL) return head1; head1 = reverse(head1); head2 = reverse(head2); struct ListNode* head = malloc(sizeof(struct ListNode)); //新头结点 struct ListNode* phead = head; //头指针 int temp = 0; //放进位和,为0或1 while(head1 != NULL || head2 != NULL){ int val = temp; //初始为上一次的进位,0或者1 if(head1 != NULL){ val = val + head1->val; //加第一个链表的结点值 head1 = head1->next; } if(head2 != NULL){ val = val + head2->val; //加第二个链表的节点值 head2 = head2->next; } temp = val / 10; //计算进位以备下一次计算用 struct ListNode* s = malloc(sizeof(struct ListNode)); //新建结点 s->val = val % 10; //把上面相加后的个位值放入新结点 phead->next = s; //尾插法插入新链表 phead = s; } if(temp > 0){ //最后的进位为1,需要多建一个结点 struct ListNode* s = malloc(sizeof(struct ListNode)); s->val = temp; //存最后进位的那个1 phead->next = s; } return reverse(head->next); //反转之后即为结果链 }