思路:将两个链表分别反转,同时新建一个头结点准备链接相加后的值。
然后两个从头开始逐位相加,进位的和留下来准备并入下一个结点的计算中,剩下的值放入一个新建的结点中,并按尾插法链入新表中。
最后把链表反转。
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); //反转之后即为结果链
}

京公网安备 11010502036488号