c++链表出现segmentation fault

在dev c++上可以运行,但是在oj上出现segmentation fault,求解是什么原因


#include<iostream>
#include<stdlib.h>
using namespace std;

struct Node{
    int data;
    Node* next;
};

typedef Node* List;

int InitList(List &list){
    list=(Node*)malloc(sizeof(Node));
    list->next=NULL;
}

int DestroyList(List &list){
    List p1,p2;
    p1=list;
    while(list->next!=NULL){
        p2=p1->next;
        free(p1);
        p1=p2;
    }
    free(p1);
}

int AddNode(List &list,int data){
    Node *p=list,*newnode;
    newnode=(Node*)malloc(sizeof(Node));
    newnode->next=NULL;
    newnode->data=data;
    while(p->next!=NULL){
        p=p->next;
    }
    p->next=newnode;
}

void PrintList(const List &list){
    Node *p=list;
    while (p->next!=NULL){
        cout<<p->next->data<<" ";
        p=p->next;
    }
    cout<<endl;
}

List MergeList(const List &listA,const List &listB){
    List listC;    
    InitList(listC);
    List p1=listA,p2=listB;
    while(p1->next!=NULL&&p2->next!=NULL){
        if(p1->next->data>=p2->next->data){
            AddNode(listC,p2->next->data);
            p2=p2->next;
        }
        else{
            AddNode(listC,p1->next->data);
            p1=p1->next;
        }
    }
    
    if(p1->next==NULL){
        while(p2->next!=NULL){
            AddNode(listC,p2->next->data);
            p2=p2->next;
        }
    }
    
    else{
        while(p1->next!=NULL){
            AddNode(listC,p1->next->data);
            p1=p1->next;
        }
    }
    
    return listC;
}

int main(){
    int m,n;
    cin>>m>>n;
    List listA,listB;
    InitList(listA);
    InitList(listB);
    
    for(int i=0;i<m;i++){
        int v;cin>>v;
        AddNode(listA,v);
    }
    
    for(int i=0;i<n;i++){
        int v;cin>>v;
        AddNode(listB,v);
    }
    
    List listC=MergeList(listA,listB);
    PrintList(listC);
    
    DestroyList(listA);
    DestroyList(listB);
    DestroyList(listC);
    
    return 0;
}