不知道大家有没有做过一道经典的题目,两个长度为15的有序链表的合并,大家先看题目。
那么这道题该如何做尼,首先我们用比较笨的办法,用链表做。
首先我们创建两个链表,那么该如何将两个链表合并尼,只需要创建两个指针,指向两个链表,然后比较两个链表中第一位的大小,让小的做第一位,然后while循坏就行,先看代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct student{
int data;
struct student *next;
}node,*pnode;
void creast(pnode head){
head->next = NULL;
pnode tail;
tail = head;
for(int i=0;i<15;i++){
pnode pnew = (pnode)malloc(sizeof(node));
scanf("%d",&pnew->data);
pnew->next = tail->next;
tail->next = pnew;
tail = pnew;
}
tail->next = NULL;
}
//链表合并
pnode Merge( pnode L1, pnode L2 ){
pnode head = (pnode)malloc(sizeof(node));
pnode L;
//pnode L = (pnode)malloc(sizeof(node));
head = L;
L->next = NULL;
pnode q,p;
p = L1->next;
q = L2->next;
while(p!=NULL&&q!=NULL){
if(p->data<=q->data){
L->next = p;
L = L->next;
p = p->next;
}else{
L->next = q;
L = L->next;
q = q->next;
}
}
if(p!=NULL){
L->next=p;
}
if(q!=NULL){
L->next=q;
}
L1->next=NULL;
L2->next=NULL;
return head;
}
void iprintf(pnode head){
pnode p = head;
p = p->next;
while(p!=NULL){
printf("%d ",p->data);
p = p->next;
}
}
int main(){
pnode L1 = (pnode)malloc(sizeof(node));
L1->next = NULL;
creast(L1);
pnode L2 = (pnode)malloc(sizeof(node));
L2->next = NULL;
creast(L2);
pnode L;
L = Merge(L1,L2);
iprintf(L);
// iprintf(L1);
// iprintf(L2);
return 0;
}
当然还有个简单方法,不需要链表,你就相当于输入30个数排序,且看下面的代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main()
{
int i,j=0,k,s[100];
for(i=1;i<=15;i++)
scanf("%d",&s[i]);
getchar();
for(i=16;i<=30;i++)
scanf("%d",&s[i]);
for(i=1;i<=29;i++)
{
for(j=1;j<=30-i;j++)
{
if(s[j]>s[j+1])
{
k=s[j];
s[j]=s[j+1];
s[j+1]=k;
}
}
}
for(i=1;i<=30;i++)
printf("%d ",s[i]);
}
以上就是今天我分享的内容,那么我问大家,两个无序链表的合并该怎么做?
关注我,下篇为你解决。