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;
}