PTA--两个有序链表序列的合并

题目:

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。

输入格式:

输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。

输出格式:

在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL

输入样例:

1 3 5 -1
2 4 6 8 10 -1

输出样例:

1 2 3 4 5 6 8 10

解题: 

思路就是创建两个链表存放输入的数,再创建一个新链表表示新的合并链表。

代码:

#include
using namespace std;
struct node{
	int value;
	struct node *next; 
};
struct node* creat()
{
	struct node *h,*p;
	//初始化链表,表示链表为空 ,这个新建链表含头节点 
	h = NULL;
	//分配内存空间 
	h = (struct node*) malloc(sizeof(struct node));
	//p指向头节点,用来遍历链表 
	p = h;
	int n;
	cin>>n;
	while(n != -1) 
	{
		struct node *pt;
		//指向新创建的节点 
		pt = (struct node*) malloc(sizeof(struct node));
		pt->value = n;
		//将新节点连接到当前节点的后面 
		p->next = pt;
		// 更新当前节点 
		p = pt;
		//将新节点的next指针置空,表示新节点是链表的最后的一个节点 
		pt->next = NULL;
		cin>>n;
	}
	//返回头节点的下一个节点 
	return h->next;
}
int main()
{
	struct node *L1,*L2,*L3,*p1,*p2,*m,*p3;
	//先创建链表:
	L1 = creat();
	L2 = creat(); 
	p1 = L1;
	p2 = L2;
	m = (struct node*) malloc(sizeof(struct node));
	m->next = NULL;
	L3 = m;
	while(p1&&p2)
	{
		if(p1->value > p2->value)
		{
			m->next = p2;
			p2 = p2->next;
		}
		else {
			m->next = p1;
			p1 = p1->next;
		}
		m = m->next;
	}
	//如果L1中的还有剩余元素 
	while(p1)
	{
		m->next = p1;
		p1 = p1->next;
		m = m->next;
	} 
	//如果L2中还有剩余元素
	while(p2)
	{
		m->next = p2;
		p2 = p2->next;
		m = m->next; 
	} 
	int f=0;
	for(p3 = L3->next;p3!=NULL;p3 = p3->next)
	{
		if(f) cout<<" ";
		cout<value;
		f=1;
	}
	if(!f) cout<<"NULL";
	return 0;
}

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