两个有序单链表的合并


///新建了一个头结点

#include <stdio.h> #include <stdlib.h> typedef int Elemtype; typedef struct Lnode { Elemtype data; struct Lnode *next; }Lnode, *Linklist; void Create(Linklist *L1) { Lnode *p, *q; int n, x, i; *L1=(Linklist)malloc(sizeof(Lnode)); (*L1)->next=NULL; q=*L1; scanf("%d", &n); for(i=0; i<n; i++) { p=(Lnode *)malloc(sizeof(Lnode)); scanf("%d", &x); p->data=x; q->next=p; q=p; } q->next=NULL; } void Merge(Linklist L1,Linklist L2, Linklist *L) { Lnode *p1, *p2, *p3; p1=L1->next; p2=L2->next; *L=(Linklist)malloc(sizeof(Lnode)); p3=*L; p3->next=NULL; while(p1 && p2) { if(p1->data < p2->data) { p3->next=p1; p3=p3->next; p1=p1->next; } else { p3->next=p2; p3=p3->next; p2=p2->next; } } p3->next=p1?p1:p2; } void TarverseList(Linklist L) { Lnode *p=L->next; if(L->next==NULL) printf("NULL "); while(p) { printf("%d ", p->data); p=p->next; } printf(" "); } int main() { Linklist L1, L2, L; Create(&L1); Create(&L2); Merge(L1, L2, &L); TarverseList(L); return 0; }

/// 没有新建头结点,利用其中L1或L2的头结点

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

typedef int Elemtype;

typedef struct Lnode
{
    Elemtype data;
    struct Lnode *next;
}Lnode, *Linklist;

void Create(Linklist *L1)
{
    Lnode *p, *q;
    int n, x, i;

    *L1=(Linklist)malloc(sizeof(Lnode));
    (*L1)->next=NULL;

    q=*L1;

    scanf("%d", &n);
    for(i=0; i<n; i++)
    {
        p=(Lnode *)malloc(sizeof(Lnode));
        scanf("%d", &x);
        p->data=x;
        q->next=p;
        q=p;
    }
    q->next=NULL;

}

void Merge(Linklist *L1,Linklist *L2, Linklist *L)
{
    Lnode *p1, *p2, *p3;
    p1=(*L1)->next;
    p2=(*L2)->next;
    *L=p3=*L1;

    while(p1 && p2)
    {
        if(p1->data < p2->data)
        {
            p3->next=p1;
            p3=p3->next;
            p1=p1->next;
        }
        else
        {
            p3->next=p2;
            p3=p3->next;
            p2=p2->next;
        }
    }

    p3->next=p1?p1:p2;
    free(*L2);
}

void TarverseList(Linklist L)
{
    Lnode *p=L->next;
    if(L->next==NULL)
        printf("NULL
");

    while(p)
    {
        printf("%d ", p->data);
        p=p->next;
    }
    printf("
");
}

int main()
{
    Linklist L1, L2, L;

     Create(&L1);
     Create(&L2);
     Merge(&L1, &L2, &L);
     TarverseList(L);

    return 0;
}
View Code
原文地址:https://www.cnblogs.com/daydayupacm/p/5914176.html