链表合并为什么错误呢

#include<stdio.h>
#include<stdlib.h>
typedef int ElementType;
typedef struct Node PtrToNode;
struct Node {
ElementType Data; /
存储结点数据 /
PtrToNode Next; /
指向下一个结点的指针 /
};
typedef PtrToNode List; /
定义单链表类型 /
List Read(); /
细节在此不表 /
void Print( List L ); /
细节在此不表;空链表将输出NULL */
List Merge( List L1, List L2 );
int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}
List Read(){
List head,rear,temp;
rear=(List)malloc(sizeof(struct Node));
rear->Next=NULL;
head=rear;
int N;
scanf("%d",&N);
while(N){
List p;
p=(List)malloc(sizeof(struct Node));
scanf("%d",&p->Data);
p->Next=NULL;
rear->Next=p;
rear=p;
N--;
}
temp=head;
head=head->Next;
free(temp);
return head;
}
void Print(List L){
for(;L;L=L->Next)
printf("%d ",L->Data);
printf("\n");
}
List Merge(List L1,List L2){
List La,Lb,Lc,p;
p=(List)malloc(sizeof(struct Node));
p->Next=NULL;
La=L1->Next;Lb=L2->Next;Lc=p;
while(La&&Lb){
if(La->Data<=Lb->Data){
Lc->Next=La;
Lc=Lc->Next;
La=La->Next;
}
else{
Lc->Next=Lb;
Lc=Lc->Next;
Lb=Lb->Next;
}
}
if(La)Lc->Next=La;
elseLc->Next=Lb;
L1->Next=NULL;
L2->Next=NULL;
return p;
}

img

问题在于,你在Read函数中,把第一个空节点给删掉了,Print的时候也是从第一个节点开始显示的,但是在Merge函数中,反而从第二个节点开始显示的。第一个节点你直接忽略了。不该merge函数的话,就把read和print函数改了,修改如下:

List Read(){
    List head,rear,temp;
    rear=(List)malloc(sizeof(struct Node));
    rear->Next=NULL;
    head=rear;
    int N;
    scanf("%d",&N);
    while(N){
        List p;
        p=(List)malloc(sizeof(struct Node));
        scanf("%d",&p->Data);
        p->Next=NULL;
        rear->Next=p;
        rear=p;
        N--;
    }
    //删掉这3句
    //temp=head;
    //head=head->Next;
    //free(temp);
    return head;
}
void Print(List L){
    L=L->Next;  //添加这一句
    for(;L;L=L->Next)
        printf("%d ",L->Data);
    printf("\n");
}

temp=head;
head=head->Next;
free(temp);
return head;
你这段是干啥呢?把哨兵头结点干掉了啊?那你合并链表里就不能La=L1->Next;Lb=L2->Next了啊。因为L1和L2就是有数据的节点了。
建议把read函数最后这段temp的处理删除掉