c语言链表合并输出错误问题

问题遇到的现象和发生背景

合并后链表输出数目和第二个链表一样

问题相关代码,请勿粘贴截图
//程序功能:输入若干个学生成绩(输入-1为结束标志),
//建立两个已按升序排序的单向链表,头指针分别为list1、list2,
//把两个链表拼成一个升序排序的新链表,并输出新链表信息。
//要求自定义函数,实现将两个链表拼成一个链表,并返回拼组后的新链表。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<malloc.h>
struct student{
 int num;
 char name[10];
 int grade;
 struct student *next;
};
void mix(struct student *list1,struct student*list2){
 struct student *p1,*p2,*p,*l;
 int size=sizeof(struct student);
 p1=list1->next; 
 p2=list2->next;
 p=(struct student*)malloc(size); 
 while(p1&&p2){
  if(p1->grade<p2->grade){
   p->next=p1; 
   p=p1; 
   p1=p1->next;
  }
  else{
   p->next=p2;
   p=p2;
   p2=p2->next;
  }
 }
 if(p1)
         p->next = p1;
 if(p2)
         p->next = p2;
  list1->next = NULL;
  list2->next = NULL;
  printf("合并的人员:\n");
  for(l=p;p;l=l->next){
   printf("%d %s %d",l->num,l->name,l->grade);
   printf("\n");
  }
}
int main(){
 struct student *list1,*list2,*tail1,*tail2,*p1,*p2;
 int num,grade;
 char name[10];
 int size=sizeof(struct student);
 list1=list2=tail1=tail2=NULL;
 printf("输入学生学号,姓名,成绩:\n");
 scanf("%d",&num);
 while(num!=-1){
  scanf("%s %d",name,&grade);
  p1=(struct student*)malloc(size);
  p1->num=num; 
  strcpy(p1->name,name);
  p1->grade=grade; 
  p1->next=NULL;
  if(list1==NULL) 
  list1=p1;
  else 
  tail1->next=p1;
  tail1=p1;
  scanf("%d",&num);  
 }
 printf("再次输入学生学号,姓名,成绩:\n");
  scanf("%d",&num);
  while(num!=-1){
   scanf("%s %d",name,&grade);
   p2=(struct student*)malloc(size);
   p2->num=num; 
   strcpy(p2->name,name);
   p2->grade=grade; 
   p2->next=NULL;
   if(list2==NULL) 
   list2=p2;
   else 
   tail2->next=p2;
   tail2=p2;
   scanf("%d",&num);  
  }
  mix(list1,list2);
}

运行结果及报错内容

img

img

我的解答思路和尝试过的方法
我想要达到的结果

你这代码问题很多啊
1.p1=list1->next; 这里不应该先指向head吗,怎么就直接指向next了,如果链表里一共就一项,你这p1直接指向null了
2.while(p1&&p2)这里应该改为p1||p2,否则不管p1结束了还是p2结束了,就直接结束了