struct ListNode*newhead=(ListNode*)malloc(sizeof(ListNode));shimizu大佬指出:
因为你现在的库里没有ListNode这个类型,有的是struct ListNode,如果想不加这个struct的话请用typedef声明
struct ListNode*newhead=(struct ListNode*)malloc(sizeof(struct ListNode));错误信息:

solution.c: In function ‘mergeNodes'
Line 12: Char 30: error: 'ListNode' undeclared
翻译成中文就是
在函数'mergeNodes'
12行,30字符处出错了:'ListNode'没有声明
查到的参考资料:
https://blog.csdn.net/sfbpwx/article/details/103532478
(但是是C++,小白只会C)
可以通过的源代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//感悟:代码一次运行不对是正常,失败也是正常的,敢于这样去思考,去写代码,去运行代码
//就已经非常棒了,人类就是在不断失败中进步的
struct ListNode * sumMove(struct ListNode*p,int*sum);
void add(struct ListNode*n,int sum);
struct ListNode* mergeNodes(struct ListNode* head){
struct ListNode*p=head,*q;
//struct ListNode*newhead=(ListNode*)malloc(sizeof(ListNode));用typedef才可以这样写
struct ListNode*newhead=(struct ListNode*)malloc(sizeof(struct ListNode));
int sum;
struct ListNode*n=newhead;
while(p->next!=NULL){
sum=0;//小细节,勿被链表难度而击垮
q=sumMove(p,&sum);//q变为快指针,要把q放到恰好是val为0的位置
p=q;//慢针跟上
add(n,sum);//在newhead后面接新的,用指针n来实现接续newhead尾部的目的
n=n->next;//为下一次添加到newhead链表做准备
}
n->next=NULL;
return newhead->next;
}
struct ListNode* sumMove(struct ListNode*p,int*sum){//函数参数漏了一个struct,要仔细看位置
p=p->next;//避开刚开始是0的值
while(p->val!=0){
*sum+=p->val;
p=p->next;
}
return p;
}
//改一级指针的值,也就是改指针的指向,才需要传二级指针
void add(struct ListNode*n,int sum){
struct ListNode*s=(struct ListNode*)malloc(sizeof(struct ListNode));
s->val=sum;
n->next=s;
}总结:
①链表题(或者说有结构体的题,用到这些名字的题,比如malloc会用到)就要十分小心名字的叫法,确认有木有使用typedef。
②力扣中允许在目标函数之前进行函数声明。如果不声明也是会报错的。特别是相互调用的话声明一下就可以了。
③不用乱传二级指针,如果不改变一级指针的指向,那么就不必对一级指针真再去星号
④要对next,prior的含义有所理解,这种写法是顾名思义的,不必给自己搞得很累。
感谢大佬们的指导!