C++ 在c+中合并两个排序链表时出现分段错误+;

C++ 在c+中合并两个排序链表时出现分段错误+;,c++,C++,我正在解决以下问题 您将获得指向两个已排序链表的头节点的指针。两个列表中的数据将按升序排序。更改下一个指针以获得一个合并的链表,该链表也包含升序数据。给定的任何一个头指针都可能为空,这意味着对应的列表为空。 当我运行代码时,它会给我分段错误。这里p和q对应于头指针 SinglyLinkedListNode* mergeLists(SinglyLinkedListNode* p, SinglyLinkedListNode* q) { SinglyLinkedListNode *s=NUL

我正在解决以下问题

您将获得指向两个已排序链表的头节点的指针。两个列表中的数据将按升序排序。更改下一个指针以获得一个合并的链表,该链表也包含升序数据。给定的任何一个头指针都可能为空,这意味着对应的列表为空。 当我运行代码时,它会给我分段错误。这里p和q对应于头指针

SinglyLinkedListNode* mergeLists(SinglyLinkedListNode* p, SinglyLinkedListNode* q) {

    SinglyLinkedListNode *s=NULL;
    SinglyLinkedListNode *newhead;
  
    if(p==NULL)
    {
        return q;
    }
    else if(q==NULL)
    {
        return p;
    }
        
   if(p!=NULL && q!=NULL)
   {
    if(p->data<=q->data)
    {
        s=p;
        p=s->next;

    }

    else if(q->data>=p->data)
    {
        s=q;
        q=s->next;
    }
   }

    newhead = s;

    while(p || q)
    {
        if(p->data<=q->data)
        {
            s->next = p;
            s = p;
            p = s->next;
        }

        else if(q->data<=p->data)
        {
            s->next = q;
            s = q;
            q = s->next;
        }
    }

    if(p==NULL)
    {
       s->next = p;
    }
    else if(q==NULL)
    {
        s->next = q;
    }

    return newhead;

}
SinglyLinkedListNode*合并列表(SinglyLinkedListNode*p,SinglyLinkedListNode*q){
SinglyLinkedListNode*s=NULL;
SingleLinkedListNode*新头;
if(p==NULL)
{
返回q;
}
else if(q==NULL)
{
返回p;
}
如果(p!=NULL&&q!=NULL)
{
if(p->datadata)
{
s=p;
p=s->next;
}
否则如果(q->数据>=p->数据)
{
s=q;
q=s->next;
}
}
newhead=s;
while(p | | q)
{
if(p->datadata)
{
s->next=p;
s=p;
p=s->next;
}
else if(q->datadata)
{
s->next=q;
s=q;
q=s->next;
}
}
if(p==NULL)
{
s->next=p;
}
else if(q==NULL)
{
s->next=q;
}
返回newhead;
}

您在(p | | q)时检查
,然后在
p
q
上使用
->数据。如果其中一个为空,则为UB这三条语句看起来也不正确
s->next=p;s=p;p=s->next
s->next
设置为
p
,然后将
p
设置为
s->next
。最终的结果是,
p
不会改变,而(p | q)
——问问自己,如果
p
q
的长度不同,会发生什么?我建议您在编写任何代码之前在纸上画出要做的事情,因为您所展示的代码并没有考虑到明显的情况。指针很复杂,很容易编写看起来不错的代码,但事实上并非如此。在你熟悉之前,画出你想做的事情的图表真的很有帮助。@cigien已经指出了代码的一个主要问题,只是在这里加了一个挑剔的地方:在你检查了
NULL
的参数之后,第三个检查有点多余:
如果(p!=NULL&&q!=NULL)
,您已经确保了
NULL和
都不为空
您在(p | | q)
时检查
,然后在
p
q
上使用
->data
。如果其中一个为空,则为UB这三条语句看起来也不正确
s->next=p;s=p;p=s->next
s->next
设置为
p
,然后将
p
设置为
s->next
。最终的结果是,
p
不会改变,而(p | q)
——问问自己,如果
p
q
的长度不同,会发生什么?我建议您在编写任何代码之前在纸上画出要做的事情,因为您所展示的代码并没有考虑到明显的情况。指针很复杂,很容易编写看起来不错的代码,但事实上并非如此。在你熟悉之前,画出你想做的事情的图表真的很有帮助。@cigien已经指出了代码的一个主要问题,只是在这里加了一个挑剔的地方:在你检查了
NULL
的参数之后,第三个检查有点多余:
如果(p!=NULL&&q!=NULL)
,您已经确保两者都不是空的