两个有序链表序列的合并 (20 分)

已知两个非降序链表序列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

题目思路:常规建立链表思路。当然,这道题还能使用vector容器解决,更加快捷。后续有时间再写一篇博客发出来。

#include<iostream>
using namespace std;

typedef struct node {
    
    
	int data;
	struct node* next;
}List;

List* creat();
List* sort(List* L1, List* L2);
void print(List* L);
void Delete(List* L);
int main()
{
    
    
	List* L1, * L2, *L3;

	L1 = creat();
	L2 = creat();
	L3 = sort(L1, L2);
	print(L3);

	Delete(L3);
	return 0;
}
List* creat()
{
    
    
	List* head, * p, * rear;
	head = new List;
	head->next = NULL;
	rear = head;


	p = new List;
	p->next = NULL;
	cin >> p->data;
	while (p->data != -1)
	{
    
    
		rear->next = p;
		rear = p;


		p = new List;
		p->next = NULL;
		cin >> p->data;
	}

	return head;
}
void print(List* L)
{
    
    
	List* p;
	p = L->next;
	if (p)
	{
    
    
		cout << p->data;
		p = p->next;
		while (p)
		{
    
    
			cout << " " << p->data;
			p = p->next;
		}
	}
	else
		cout << "NULL";
	
	cout << endl;
}
void Delete(List* L)
{
    
    
	List* p, *q;
	p = L;
	while (p)
	{
    
    
		q = p->next;
		delete p;
		p = q;
	}

	
}
List* sort(List* L1, List* L2)
{
    
    
	List* L3, * pa, * pb, * pc;
	L3 = new List;
	pa = L1->next;
	pb = L2->next;
	pc = L3;
	while (pa && pb)
	{
    
    
		if (pa->data < pb->data)
		{
    
    
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else
		{
    
    
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb;
	
	return L3;
}

猜你喜欢

转载自blog.csdn.net/xdg15294969271/article/details/114024539