首页 > 其他 > 详细

有序链表的合并

时间:2021-05-29 17:22:43      阅读:16      评论:0      收藏:0      [点我收藏+]
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;

// 前插法创建链表 

void createList_H(LinkList &L,int n)
{
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    for(int i = 1; i <= n; i++)
    {
        // 让p作为L(头结点)指向的第一个结点, 实现前插 
        LinkList p = (LinkList)malloc(sizeof(LNode));    // 创建一个p结点 
        scanf("%d",&p->data);                            // 为结点赋值 
        p->next = L->next;                                // p指向L->next(尾部) 
        L->next = p;                                    // L(头结点)指向p 
    }
}

// 后插法创建链表 

void createList_T(LinkList &L,int n)
{
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    LinkList r = L;
    for(int i = 1; i <= n; i++)
    {
        LinkList p = (LinkList)malloc(sizeof(LNode));
        scanf("%d",&p->data);
        p->next = NULL;                                    // p指向空,这样就可以作为尾结点 
        r->next = p;                                    // 尾结点指向p 
        r = p;                                            // 插入后的p作为尾结点 
    }
}

// 合并有序链表 

void MergeLinkList(LinkList &LA,LinkList &LB,LinkList &LC)
{
    LinkList pa = LA->next;
    LinkList pb = LB->next;
    LC = LA;
    LinkList pc = LC;
    // 当有一个链表到空时结束 
    /*
        LA,LB两条链表所指向的第一个结点的值作比较,哪个更小,哪个就作为LC的下一个结点
        ,当一条链表的第一个结点作为LC的新结点时,它则指向下一个它的下一个结点 
    */ 
    while(pa && pb)
    {
        if(pa->data <= pb->data)
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
        else
        {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
    pc->next = pa?pa:pb;
    free(LB);
}

// 测试 

int main()
{
    LinkList LA;
    LinkList LB;
    LinkList LC;
    createList_T(LA,4);
    LinkList qa = LA->next;
    while(qa)
    {
        printf("%d ",qa->data);
        qa = qa->next;
    }
    createList_T(LB,7);
    MergeLinkList(LA,LB,LC);
    LinkList p = LC->next;
    while(p)
    {
        printf("%d ",p->data);
        p = p->next;
    }
    return 0;
}

 

有序链表的合并

原文:https://www.cnblogs.com/xie213/p/14825497.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!