两个有序链表的合并(超详细)

    不知道大家有没有做过一道经典的题目,两个长度为15的有序链表的合并,大家先看题目。

两个有序链表的合并(超详细)_第1张图片

     那么这道题该如何做尼,首先我们用比较笨的办法,用链表做。

    首先我们创建两个链表,那么该如何将两个链表合并尼,只需要创建两个指针,指向两个链表,然后比较两个链表中第一位的大小,让小的做第一位,然后while循坏就行,先看代码。

#include 
#include 
#include 
#include 
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 
#include 
#include 
#include  
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]);
}

以上就是今天我分享的内容,那么我问大家,两个无序链表的合并该怎么做?

关注我,下篇为你解决。

你可能感兴趣的:(c语言,链表,数据结构,算法)