数据结构单链表合并问题

代码可以正常运行,但是提交到系统中说有内存错误,错误原因显示如下:
错误原因可能是:
非法的内存引用, 具体原因可能是:
1.数组越界使用;
2.指针的错误使用, 一般是对非用户区的地址空间进行读或者写操作;
3.越权操作文件指针, 程序中却未捕捉该类错误;
4.栈溢出, 一般是因为过多的递归调用或者过大的临时变量导致;5.程序使用的内存超过了题目设定的上限。

代码如下
单链表合并

#include <iostream>
#include<stdio.h>   //用于scanf,printf标准输入输出
#include<stdlib.h>  //用于malloc,free内存申请与释放
using namespace std;
typedef struct Node *LinkList;
struct Node
{
     int data;
     LinkList next;
};
LinkList CreatFromTail()   //构建单链表
{
     LinkList q,r,L;
     int i,n;
     L=(Node*)malloc(sizeof(Node));
     r=L;
     scanf("%d",&n);
     for(i=0;i<n;i++)
     {
          q=(Node*)malloc(sizeof(Node));
          scanf("%d",&q->data);
          r->next=q;
          r=q;
     }
     r->next=NULL;
     return L;
}
LinkList merge(LinkList a,LinkList b)    //合并两个链表
{
     LinkList p=a->next;
     while(p->next)
     {
          p=p->next;
     }
     p->next=b->next;
     free(b);
     return a;
}
LinkList DeleteSame(LinkList L)    //删除链表中的重复元素
{
     LinkList p=L->next,q,r;
     while(p!=NULL)
     {
          r=p->next;
          q=p;
          while(r!=NULL)
          {
               if(r->data==p->data)
               {
                    q->next=r->next;
                    r=r->next;
               }
               else
               {
                    q=q->next;
                    r=r->next;
               }
          }
          p=p->next;
     }
     return L;
}
LinkList sort(LinkList L)    //排序
{
     LinkList p=L->next,q,r;
     if(p!=NULL)
     {
          r=p->next;
          p->next=NULL;
          p=r;
          while(p!=NULL)
          {
               r=p->next;
               q=L;
               while(q->next!=NULL&&q->next->data<p->data)
                    q=q->next;
               p->next=q->next;
               q->next=p;
               p=r;
          }
     }
     return L;
}
void show(LinkList l)    //输出链表
{
     LinkList p=l;
     while(p)
     {
          p=p->next;
          printf("%d",p->data);
          printf(" ");
     }
}
int main()
{
     LinkList w,v,y,z,s;
     w=CreatFromTail();
     v=CreatFromTail();
     y=merge(w,v);
     s=DeleteSame(y);
     z=sort(s);
     show(z);
     return 0;
}

我觉得可以把指针改成数组,直接表示下一个的下标,这样可以防止出错