/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head1 ListNode类 * @param head2 ListNode类 * @return ListNode类 */ struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) { //思路(由于结点数量最大1000000个,因此不可用数字转换方法) //将两个链表逆转,方便从低位开始计算 //从二者低位开始相加,每次记录是否满10,若满10则在二者的下一位计算中加入1 //创建新链表放置结果 struct ListNode* nodeTmp = NULL; struct ListNode* reverse1Node = NULL; struct ListNode* reverse2Node = NULL; struct ListNode reverseHead1Node = { .next = head1 }; struct ListNode reverseHead2Node = { .next = head2 }; struct ListNode resultHeadNode = { .next = NULL }; int numberTmp = 0; char upToTen = 0; //逆转链表1 nodeTmp = head1->next; while (head1->next) { head1->next = nodeTmp->next; nodeTmp->next = reverseHead1Node.next; reverseHead1Node.next = nodeTmp; nodeTmp = head1->next; } //逆转链表2 nodeTmp = head2->next; while (head2->next) { head2->next = nodeTmp->next; nodeTmp->next = reverseHead2Node.next; reverseHead2Node.next = nodeTmp; nodeTmp = head2->next; } //计算生成结果链表 reverse1Node = reverseHead1Node.next; reverse2Node = reverseHead2Node.next; while (reverse1Node != NULL || reverse2Node != NULL) { if (reverse1Node != NULL && reverse2Node != NULL) { //将链表结点从开到尾,两两相加 numberTmp = reverse1Node->val + reverse2Node->val; //移动链表指针 reverse1Node = reverse1Node->next; reverse2Node = reverse2Node->next; } else { //其中一个链表已经遍历结束,则只计算另一链表的剩余结点 if (reverse1Node == NULL) { numberTmp = 0 + reverse2Node->val; reverse2Node = reverse2Node->next; // 移动链表指针 } else if (reverse2Node == NULL) { numberTmp = reverse1Node->val + 0; reverse1Node = reverse1Node->next; // 移动链表指针 } } //创建新结点 numberTmp += upToTen; nodeTmp = (struct ListNode*)malloc(sizeof(struct ListNode)); nodeTmp->val = numberTmp % 10; nodeTmp->next = resultHeadNode.next; resultHeadNode.next = nodeTmp; //满十进一 if (numberTmp > 9) { upToTen = 1; } else { upToTen = 0; } } //最后一次计算满十,需要增加一个结点 if(upToTen == 1) { nodeTmp = (struct ListNode*)malloc(sizeof(struct ListNode)); nodeTmp->val = 1; nodeTmp->next = resultHeadNode.next; resultHeadNode.next = nodeTmp; } return resultHeadNode.next; }