链表合并

本文介绍了一种使用链表实现的并集算法,该算法能够处理两个非降序链表的并集操作,生成一个新的非降序链表,且不修改原始链表数据。文章详细解释了算法的实现过程,包括创建链表、查找重复元素、插入元素以及合并链表的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】
两个非降序链表的并集,例如将链表1->2->3 和 2->3->5 并为 1->2->3->5,只能输出结果,不能修改两个链表的数据。

【输入形式】
第一行首先是数据的个数,然后是第一个链表的各结点值,以空格分隔。
第二行首先也是数据的个数,然后是第二个链表的各结点值,以空格分隔。

【输出形式】
合并好的链表,以非降序排列,值与值之间以空格分隔。

【样例输入】
4 4 7 10 34
7 1 4 6 29 34 34 52

【样例输出】
1 4 6 7 10 29 34 52

【评分标准】
要使用链表实现,否则不能得分。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#include<string.h>

typedef struct Node
{
	int data;
	struct Node* next;
 }Node;

typedef Node* point;

 Node* create(int x) 
 {
 	Node *L,*s;
 	int temp,i;
 	L=(Node*)malloc(sizeof(Node));
 	L->next=NULL;
   for(i=1;i<=x;i++)
 	{       scanf("%d",&temp);
 			s=(Node*)malloc(sizeof(Node));
 			s->data=temp;
 		    s->next=L->next;
			L->next=s; 
	 }

	 return L;
 }


int s_et(point &head,int x)//找重复元素 c++可以用引用,相当方便 
{
	Node* p=head;
	while(p!=NULL&&p->data!=x)
		p=p->next;
		if(p!=NULL)//有重复元素
		return p->data; 
		return 0;//没有重复返回0 
		
}

 void Insert(Node* &head,int x)
{ 
  if(head==NULL)//考虑第一个元素,没有头,要建头 
   {
   	head= (Node*)malloc(sizeof(struct Node));
   	head->next=NULL;
   }
    if(s_et(head,x)==0)// 没有重复的元素则插入 
	 {	Node *s;
	    s=(Node*)malloc(sizeof(Node));
	   s->data=x;
	   s->next=head->next;//头插法建新表 
	   head->next=s;
	 }

 } 

 
 
 
 Node* Merge(Node* p,Node* q)//两者比较 
 {  Node *L;
    L=NULL;
    p=p->next;
    q=q->next; 
 while(p!=NULL&&q!=NULL)
 {
 	if(p->data>q->data)//大的数存进去,头插法所以大的元素在后面 
 	{Insert(L,p->data);
 	p=p->next;
	 }
	 
 	else if(p->data<q->data)
 	{Insert(L,q->data);
 		q=q->next;
	 }
	 
	 else{ 
	 	Insert(L,p->data);//相等的话就直接存进任意一个进去 
	 	p=p->next;
	 	q=q->next;
	 }

 }
 
while(p!=NULL)//p有剩余,剩的都是小的,直接全部存进新链表 
{
	Insert(L, p->data);
        p=p->next;
}

while(q!=NULL)
{
	Insert(L, q->data);
        q=q->next;
}

return L;
}
 
void show(Node* L)
{  Node *p;
   p=L->next;
	while(p!=NULL)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}
 int main()
 {
 	int a,b;
 	Node *L1,*L2,*L3;
 	scanf("%d",&a);
 	L1=create(a);
    scanf("%d",&b);
    L2=create(b);

    L3=Merge(L1,L2);
    show(L3);
 	
 	
 }
 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值