[求大佬]不明原因导致访问越界(提示Process returned -1073741819 (0xC0000005))

实现将两段递增有序链表合并为一段递减有序链表时出现的错误.
代码如下:

//头文件
#ifndef LINKANDLINKNODEOFINTFORHOMEWORK_H_INCLUDED
#define LINKANDLINKNODEOFINTFORHOMEWORK_H_INCLUDED
using namespace std;
template<class T>
class LinkNode//节点类
{
public:
    T data;//数据域
    LinkNode<T> *next;//指针域
    LinkNode(T data = 0)
    {
        this->data = data;
        this->next = NULL;
    }
};

template<class T>
class Link//链表类模板(该链表无头节点)
{
private:
    int Size;
public:
    LinkNode<T> *head;
    LinkNode<T> *tail;
    Link(int Size = 0)
    {
        this->head = NULL;
        this->tail = NULL;
        this->Size = 0;
    }
    void push(T data)//输入数据
    {
        LinkNode<T> *x = new LinkNode<T>(data);
        if(tail == NULL)
        {
            head = tail = x;
        }
        else
        {
            tail->next = x;//尾节点后再加一位使之成为新的尾结点.
            tail = x;//让原来的尾结点成为新的数据存储点.
        }
        Size += 1;
    }
    void print()//输出链表
    {
        LinkNode<T> *p = this->head;
        for(;p!=tail;p = p->next)
        {
            cout << p->data;
        }
        cout << tail->data;
        cout << endl;
        cout<<"链表输出完毕。"<<endl;
    }
    LinkNode<T>* AddOfHead();//返回头节点地址
    LinkNode<T>* AddOfTail();//返回尾结点地址
    void upsidedown();//链表倒置
    void FunForLink(Link<T> *a,Link<T> *b,Link<T> *New);//将两个元素递减有序的链表整合为一个递减有序的链表
};

template<class T>
LinkNode<T>* Link<T> :: AddOfHead()
{
    return this->head;
}

template<class T>
LinkNode<T>* Link<T> :: AddOfTail()
{
    return this->tail;
}

template<class T>
void Link<T> :: upsidedown()//链表倒置
{
    LinkNode<T> *a = tail;
    LinkNode<T> *p;

    while(tail != head)
    {
        for(p = head;p->next!= tail;p = p->next)
        {
            ;//每一次循环都是查找当前tail节点的前一位
        }
        tail->next = p;//这一步是让tail的后继指针域指向p所指向的节点.
        tail=p;//让tail指向原来的它所指向的已经变化过的下一位节点.
    }

    head = a;
}

template<class T>
    void Link<T> :: FunForLink(Link<T> *a,Link<T> *b,Link<T> *New)//将两个的递减有序的链表整合为一个递减有序的链表
    {
        LinkNode<T>* tempa=new LinkNode<T>();
        LinkNode<T>* tempb=new LinkNode<T>();
        tempa=a->head;
        tempb=b->head;
        //cout<<tempa->data<<endl;
        //cout<<a->head->data<<endl;
        if(tempa->data==tempb->data)
        {
            New->push(tempa->data);
            tempa=tempa->next;
        }
        else
        {
            New->push(tempb->data);
            tempb=tempb->next;
        }
            while(tempa!=NULL||tempb!=NULL)
            {
                    if(tempa->data==NULL)
                    {
                        while(tempb!=NULL)
                        {
                            New->push(tempb->data);
                            tempb=tempb->next;
                        }
                    }
                    else if(tempb==NULL)
                    {
                        while(tempa!=NULL)
                        {
                            New->push(tempa->data);
                            tempa=tempa->next;
                        }
                    }
                    else if(tempa->data>=tempb->data)
                    {
                        New->push(tempa->data);
                        tempa=tempa->next;
                    }
                    else if(tempa->data<tempb->data)
                    {
                        New->push(tempb->data);
                        tempb=tempb->next;
                    }
            }
            delete tempa;
            delete tempb;
    }

#endif // LINKANDLINKNODEOFINTFORHOMEWORK_H_INCLUDED



以下是实现.

#include<iostream>
#include"LinkAndLinknodeOfIntForHomework.h"

using namespace std;

int main()
{
    Link<int> *a=new Link<int>(0);
    Link<int> *b=new Link<int>(0);
    int lenofa=0;
    int lenofb=0;
    Link<int> *newlink=new Link<int>(0);
    cout<<"请输入"<<endl;
    cout<<"①a链表(递增有序)的长度:"<<endl;
    cin>>lenofa;
    int sta=lenofa;
    while(lenofa!=0)
    {
        int tempa=0;
        cout<<"请输入第"<<sta-lenofa+1<<"个数字"<<endl;
        cin>>tempa;
        a->push(tempa);
        lenofa--;
    }
    a->upsidedown();
    cout<<"②b链表(递增有序)的长度:"<<endl;
    cin>>lenofb;
    int stb=lenofb;
    while(lenofb!=0)
    {
        int tempb=0;
        cout<<"请输入第"<<stb-lenofb+1<<"个数字"<<endl;
        cin>>tempb;
        b->push(tempb);
        lenofb--;
    }
    b->upsidedown();
    cout<<"接下来开始执行主程序:"<<endl;
    newlink->FunForLink(a,b,newlink);
    cout<<newlink->head->data;
    return 1;
}

运行窗口:
图片说明
求大佬指点迷津.