#include<stdio.h> //两个有序递增的单链表(有头结点),合并为新单链表。
#include<stdlib.h> //【用尾插法表示这两个链表较好,因为这样创建链表是有序的,递增的。
//如果用头插法,for循环改为for(i=n;i>=0,i++),使其新建的链表递增】
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
/* LNode* creat(LNode *&L,int a[],int n) //头插法创建新链表,并返回头节点
{
LNode *s;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
for(int i=0;i<=n;i++)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=a[i];
s->next=L->next;
L->next=s;
}
return L;
}
*/
LNode* creat(int a[],int n) //尾插法创建新链表(带头结点),并返回头节点
{
LNode *L,*s,*r;
L=(LNode*)malloc(sizeof(LNode));
r=L; //r始终指向尾结点
L->next=NULL;
for(int i=0;i<=n;i++)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=a[i];
r->next=s; //r->next代表头结点后面的那个节点 令其指向新节点
r=r->next; //r始终指向尾结点,所以++r
}
r->next=NULL; //尾插法结束后要结尾,令最后一个节点(就是r)指向NULL
printf("\n");
return L;
}
void merge(LNode *A,LNode *B,LNode *&C) //合并两个链表,并返回头结点
{
LNode *p = A->next;
LNode *q = B->next;
LNode *r,*m; //r始终指向新链表的最后节点
r=C;
while(p!=NULL&&q!=NULL)
{
if(p->data<=q->data)
{
m=(LNode*)malloc(sizeof(LNode)); //3行 给合并后的链表C开辟空间,并将A链表的值带入,【为了防止改变A链表的值】
m->next=NULL;
m->data=p->data;
r->next=m;
p=p->next;
r=r->next;
}
else
{
m=(LNode*)malloc(sizeof(LNode));
m->next=NULL;
m->data=q->data;
r->next=m;
q=q->next;
r=r->next;
}
}
r->next=NULL;
if(p!=NULL)
r->next=p;
if(q!=NULL)
r->next=q;
}
void print(LNode *L) //输出新链表
{
L=L->next;
while(L!=NULL)
{
printf("%d ",L->data);
L=L->next;
}
printf("\n");
}
void main()
{
char n;
LNode *A,*B,*C;
int a[8]={1,3,4,6,10,11};
int b[8]={2,5,7,8,9,12};
A=creat(a,5);
B=creat(b,5);
print(A);
print(B);
C=(LNode*)malloc(sizeof(LNode));
C->next = NULL;
merge(A,B,C);
print(C);
}
#include<stdlib.h> //【用尾插法表示这两个链表较好,因为这样创建链表是有序的,递增的。
//如果用头插法,for循环改为for(i=n;i>=0,i++),使其新建的链表递增】
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
/* LNode* creat(LNode *&L,int a[],int n) //头插法创建新链表,并返回头节点
{
LNode *s;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
for(int i=0;i<=n;i++)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=a[i];
s->next=L->next;
L->next=s;
}
return L;
}
*/
LNode* creat(int a[],int n) //尾插法创建新链表(带头结点),并返回头节点
{
LNode *L,*s,*r;
L=(LNode*)malloc(sizeof(LNode));
r=L; //r始终指向尾结点
L->next=NULL;
for(int i=0;i<=n;i++)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=a[i];
r->next=s; //r->next代表头结点后面的那个节点 令其指向新节点
r=r->next; //r始终指向尾结点,所以++r
}
r->next=NULL; //尾插法结束后要结尾,令最后一个节点(就是r)指向NULL
printf("\n");
return L;
}
void merge(LNode *A,LNode *B,LNode *&C) //合并两个链表,并返回头结点
{
LNode *p = A->next;
LNode *q = B->next;
LNode *r,*m; //r始终指向新链表的最后节点
r=C;
while(p!=NULL&&q!=NULL)
{
if(p->data<=q->data)
{
m=(LNode*)malloc(sizeof(LNode)); //3行 给合并后的链表C开辟空间,并将A链表的值带入,【为了防止改变A链表的值】
m->next=NULL;
m->data=p->data;
r->next=m;
p=p->next;
r=r->next;
}
else
{
m=(LNode*)malloc(sizeof(LNode));
m->next=NULL;
m->data=q->data;
r->next=m;
q=q->next;
r=r->next;
}
}
r->next=NULL;
if(p!=NULL)
r->next=p;
if(q!=NULL)
r->next=q;
}
void print(LNode *L) //输出新链表
{
L=L->next;
while(L!=NULL)
{
printf("%d ",L->data);
L=L->next;
}
printf("\n");
}
void main()
{
char n;
LNode *A,*B,*C;
int a[8]={1,3,4,6,10,11};
int b[8]={2,5,7,8,9,12};
A=creat(a,5);
B=creat(b,5);
print(A);
print(B);
C=(LNode*)malloc(sizeof(LNode));
C->next = NULL;
merge(A,B,C);
print(C);
}