#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode{
ElemType data; //指向数据元素的基地址
struct LNode *next; //线性表的当前长度
}LNode,*LinkList;
Status InitList_L(LinkList L)
{
//构造一个空的单链表L
L=(LinkList)malloc(sizeof(LNode));
L->next = NULL; //头结点的指针域置空
return OK;
}
LinkList CreateList_L(LinkList L,int n)
{
LinkList p,r;
//正位序输入n个元素的值,建立带表头结点的单链表L
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
r=L; //尾指针r指向头结点
for( int i=0;i<n;++i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=NULL;
r->next=p;
r=p;
}
return L;
}
//依次输出单链表里的每个元素
void TraverseList_L(LinkList L)
{
LinkList p;
p=L->next;
while(p){
printf("%d",p->data);
if(p->next){
printf(",");
}
p=p->next;
}
printf("\n");
}
LinkList MergeList_L(LinkList LA,LinkList LB,LinkList LC){
LinkList pa=LA->next;
LinkList pb=LB->next;
LC=LA;
LinkList pc=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);
return LC;
}
int main()
{
LinkList LA,LB,LC;
int a,b;
InitList_L(LA);
InitList_L(LB);
//提示:请输入有序表LA的元素个数
scanf("%d",&a);
LA=CreateList_L(LA,a);
TraverseList_L(LA);
//提示:请输入有序表LB的元素个数
scanf("%d",&b);
LB=CreateList_L(LB,b);
TraverseList_L(LB);
LC=MergeList_L(LA,LB,LC);
TraverseList_L(LC);
return 0;
}
代码中我只注释了一行,就是其中三元运算符。其余讲解可移步
https://blog.youkuaiyun.com/qq_64594090/article/details/123927878
我的这篇文章详解。
算法分析
该链表算法和顺序表的时间复杂度相同,但是不需要新建节点空间。所以空间复杂度为O(1)。