数据结构 — 1. 两个非递减有序单链表合并为非递增有序单链表

【问题描述】假设两个带头结点的非递减有序单链表,头指针分别为La和Lb,现归并La和Lb得到一个非递增的有序单

链表,用La作为该新单链表的头指针.在编程过程中,不能增加新结点,只能以La和Lb中的结点为基础,通过调整指针

得到非递增的有序单链表.

【样例输入】2 4 8 10 20 25 30 40 100 -1
                     1 2 2 4 27 -1

【样例输出】100 40 30 27 25 20 10 8 4 4 2 2 2 1


/*2 4 8 10 20 25 30 40 100 -1
1 2 2 4 27 -1
<output>100,40,30,27,25,20,10,8,4,4,2,2,2,1</output>

1 3 5 7 -1
2 4 6 6 8 11 13 15 -1
        <output>15 13 11 8 7 6 6 5 4 3 2 1</output>
2 4 8 10 20 25 30 40 100 -1
1 2 2 4 27 -1
        <output>100 40 30 27 25 20 10 8 4 4 2 2 2 1</output>
1 -1
2 4 6 8 10 12 -1

        <output>12 10 8 6 4 2 1</output>

2 4 6 8 10 12 -1
1 -1
        <output>12 10 8 6 4 2 1</output>

1 1 2 3 5 7 -1
2 2 2 2 2 2 -1
        <output>7 5 3 2 2 2 2 2 2 2 1 1</output>
*/

#include<stdio.h>
#include<malloc.h>
typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode,*Linklist;


void creatlist(Linklist &l)
{
	Linklist p,q;
	l=(Linklist)malloc(sizeof(LNode));
	l->next=NULL;

	p=l;

	while(1)
	{
		q=(Linklist)malloc(sizeof(LNode));
        q->next=NULL;
		scanf("%d",&q->data);
		if(q->data<0)
			break;

		p->next=q;
		p=q;
	}

}

void print(Linklist l)
{
	Linklist p;
	p=l->next;
	while(p)
	{
	  printf("%d ",p->data);
	  p=p->next;
	}
}

void mergelist(Linklist &la,Linklist &lb,Linklist &l)
{
    /*
    pre是中间指针
    pre代替一下
    pa/pb头插进去
    pa/pb“++”
    */
	Linklist pa,pb,pre;
	pa=la->next;
	pb=lb->next;

	l=la;
	la->next=NULL;

	while(pa&&pb)
	{

		if(pa->data<=pb->data)
		{
			pre=pa->next;
			pa->next=la->next;
			la->next=pa;
		    pa=pre;
		}
		else
		{
			pre=pb->next;
			pb->next=la->next;
			la->next=pb;
			pb=pre;
		}
	}

	while(pa)
	{
		pre=pa->next;
        pa->next=la->next;
		la->next=pa;
		pa=pre;
	}

	while(pb)
	{
        pre=pb->next;
	    pb->next=la->next;
		la->next=pb;
		pb=pre;
	}


	free(lb);
}


int  main()
{
	Linklist A,B,t;
	creatlist(A);
	creatlist(B);
	mergelist(A,B,t);
	print(t);
    return 0;
}



评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PeersLee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值