首页 > 代码库 > 合并链表

合并链表

【问题描述】

1、建立两个有序的单链表,表中元素的数据类型自己指定;

2、将建立的两个链表合并为一个新的有序的单链表;

3、输出显示已合并好的有序的单链表。

【输入形式】输入表1的元素个数,表1的元素值(逆序),同表1,输入表2的数据。
【输出形式】输出合并后的元素值。
【样例输入】

   3       //表1元素个数

   22 21 19  //表1的元素值(逆序)

   4         //表2元素个数

   92 91 31 29  //表2的元素值(逆序)
【样例输出】

   The current List is:

   19,21,22,29,31,91,92

思路分析:将两个链表的值比较然后,较大者的节点用逆向建立单链表法链入。

代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int data;
    struct node *next;
}LNode;

LNode *CreateLinkList()
{
    LNode *head,*p,*q;
    int i,n;
    head=(LNode*)malloc(sizeof(LNode));
    head->next=NULL;
    p=head;
    q=p;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        p=(LNode*)malloc(sizeof(LNode));
        scanf("%d",&p->data);
        p->next=NULL;
        q->next=p;
        q=p;
    }
    return head;

}

void Merge(LNode *La,LNode *Lb,LNode **Lc)
{
    LNode *p,*q,*s;
    p=La->next;
    q=Lb->next;
    *Lc=La;
    (*Lc)->next=NULL;
    free(Lb);
    while(p!=NULL&&q!=NULL)
    {
        if(p->data>q->data)
        {
            s=p;
            p=p->next;
        }
        else
        {
            s=q;
            q=q->next;
        }
        s->next=(*Lc)->next;
        (*Lc)->next=s;
    }
    if(p==NULL)
      p=q;
    while(p!=NULL)
    {
        s=p;
        p=p->next;
        s->next=(*Lc)->next;
        (*Lc)->next=s;
    }
}

void print(LNode *p)
{
    int first=1;
    p=p->next;
    while(p!=NULL)
    {
        if(first)
        first=0;
        else
        printf(",");
        printf("%d",p->data);
        p=p->next;

    }
    printf("\n");
}
int main()
{
    LNode *La,*Lb,*Lc;
    La=CreateLinkList();
    Lb=CreateLinkList();
    Merge(La,Lb,&Lc);
    printf(" The current List is:\n");
    print(Lc);
}

 

合并链表