题解 | 链表相加(二)
链表相加(二)
https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
#include <stdlib.h>
struct ListNode* reverse(struct ListNode* head){
struct ListNode *cur=head,*pre=NULL;
while(cur!=NULL){
struct ListNode *temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
}
struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) {
// write code here
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 *nHead=Head;//设置nHead指针遍历新链表,保留Head作为新链表的头节点,以便后续反转链表时可以直接传入Head节点
int tmp=0;//进位初始置零
while(head1!=NULL || head2!=NULL){//链表长度不一致时,多出来的节点也要加入计算。注意!!!不要使用&&(并且)
int val=tmp;//节点的val等于val值加进位
if(head1!=NULL){
val+=head1->val;
head1=head1->next;
}
if(head2!=NULL){
val+=head2->val;
head2=head2->next;
}
tmp=val/10;//进位值更新
nHead->next=(struct ListNode*)malloc(sizeof(struct ListNode));//注意!!!第一个括号内必须带*号
nHead->next->val=val%10;//新节点赋值
nHead=nHead->next;//nHead指针后移
}
if(tmp>0){//当计算完所有节点后还有进位再加一个节点
nHead->next=(struct ListNode*)malloc(sizeof(struct ListNode));
nHead->next->val=tmp;
}
return reverse(Head->next);
}
查看20道真题和解析