两个带有头节点的单链表链表1和链表2,单调递增有序,编写函数求两个链表中的相交部分,调整删除链表1中,并成为一个递减有序的单链表,给出算法思想和相应代码。

算法思想:

  在链表1中找到与链表2相交的部分,其余部分删除,再将链表1中的节点用头插法进行逆置。

相应代码:

LinkList SameAB (LinkList &A , LinkList B ){
    LNode  *p=A->next;
    LNode *pre=A;
    LNode *q=B->next;
//这里用指针p和q分别指向链表A和B的第一个节点,用指针pre指向链表A的头节点
    While(p!=NULL && q!=NULL){
        if(p->data <  q->data){
            pre->next=p->next;
            free(p);
            p=pre->next;
        }//如果p小于q,p向后移,并释放当前p的节点
        else if(p->data > q->data){
            q=q->next;
        }//如果q小于p,q向后移
        else{
            pre=p;
            p=p->next;
            q=q->next;
        }//如果p和q相等,将p留在A中,q向后移
//当B链表扫描完,A链表还有剩余节点时,将A链表中的剩余节点释放掉
        While(p!=NULL){
            pre-next=p-next;
            free(p);
            p=pre->next;
        }
        pre=A->next;
        p=pre->next;
        A->next=NULL;
        While(pre!=NULL){
            pre->next=A->next;
            A->next=pre;
            pre=p;
            p=p->next;
        }//将A就地逆置
    }
    return A;
}

 

posted @ 2021-08-01 09:50  优雅的水晶炮炮  阅读(128)  评论(0)    收藏  举报