兩個有序鏈表序列的合併

#include<stdio.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,LinkList;//這裏實際上是兩句話typedef struct LNode LNode和typedef //struct LNode Linklist將結構體類型struct LNode重命名爲LNode將struct LNode //*重命名爲LinkList
在這裏插入圖片描述

LinkList creat_list();//聲明creat_list函數
LinkList hb(LinkList L1,LinkList L2);//聲明hb函數
void print(LinkList L);//聲明print函數
int main()
{
LinkList L1=creat_list();
LinkList L2=creat_list();
LinkList L;
L=hb(L1,L2);
print(L);
return 0;
}
LinkList creat_list()//尾插法建表,帶有頭結點
{
LinkList L=new struct LNode;
L->next=NULL;
int e;
scanf("%d",&e);
LinkList r=L;
while(e!=-1)
{
LinkList s=new struct LNode;
s->next=NULL;
s->data=e;
s->next=r->next;
r->next=s;
r=s;
scanf("%d",&e);
}
return L;
在這裏插入圖片描述

}
LinkList hb(LinkList L1,LinkList L2)
{
LinkList r,L;//struct LNode r ,l
r=L=L1;//直接利用L1的頭結點,不用另開空間了,最後釋放L2的頭結點,
//這裏沒有釋放也對了
LinkList p1=L1->next,p2=L2->next;//此時p1date域放1,p2date域放2(根據
//題意)
while(p1&&p2)//當p1,p2不爲null時
{
if(p1->data<=p2->data)
{
r->next=p1;
r=p1;
p1=p1->next;
}
else
{
r->next=p2;
r=p2;
p2=p2->next;
}
}
在這裏插入圖片描述

r->next=p1?p1:p2;//剩餘的不用動,直接接上//比完加完之後還剩一個date最
//大的節點p,直接加到後面
return L->next;//返回首元,直接打印
}

void print(LinkList L)//注意打印時的格式,設置一個標識符 { if(!L) printf(「NULL」); int flag=0; LinkList p=L; while§//一直遍歷到null { if(flag!=0) printf(" 「); printf(」%d",p->data); p=p->next; flag=1; } }