求两个有序链表的交集和差集

typedef struct ListNode
{
	DataType data;
	ListNode* next;
}ListNode;


//交集(注意:list1和list2如果各有2个4,交集也会出现两次)
ListNode* Intersection(ListNode* plist1, ListNode* plist2)		
{
	//判断不为空
	if(plist1 == NULL || plist2 == NULL)
	{
		return NULL;
	}

	//头结点(哨兵位节点)
	ListNode* newlist = BuyNode(0);
	ListNode* tail = newlist;
	
	//相等了一起走,值给tail,不相等小的走
	while(plist1 && plist2)
	{
		if(plist1->data == plist2->data)
		{
			tail->next = plist1;
			tail = plist1;
			plist1 = plist1->next;
			plist2 = plist2->next;
		}
		else if(plist1->data < plist2->data)
		{
			plist1 = plist1->next;
		}
		else
		{
			plist2 = plist2->next;
		}
	}
	tail->next = NULL;	//注意tail->next要置空
	return newlist->next;
}
//差集
ListNode* DifSet(ListNode* plist1, ListNode* plist2)
{
	//判断不为空
	if(plist1 == NULL || plist2 == NULL)
	{
		return NULL;
	}
	
	//头结点(哨兵位节点)
	ListNode* newlist = BuyNode(0);
	ListNode* tail = newlist;

	while(plist1 && plist2)
	{
		//相等一起走
		if(plist1->data == plist2->data)
		{
			plist1 = plist1->next;
			plist2 = plist2->next;
		}
		else if(plist1->data < plist2->data)
		{
			tail->next = plist1;
			tail = plist1;
			plist1 = plist1->next;
		}
		else
		{
			tail->next = plist2;
			tail = plist2;
			plist2 = plist2->next;
		}
	}

	if(plist1)
	{
		tail->next = plist1;
	}
	else
	{
		tail->next = plist2;
	}

	return newlist->next;
}








数据结构链表可以用于实现动态数组,支持元素的插入、删除和查找操作。要将链表从小到大排列,你可以采用归并排序或冒泡排序的思想。这里简单描述一种插入排序的方式: 1. 遍历整个链表,对于每个节点,将其值与已排序部分的最后一个节点比较,如果当前值小于后者,就将它插入到适当置,保持链表有序。 至于链表的集合运算(交集、并集和差集),由于链表不是哈希集合,通常需要遍历整个链表来进行操作。以下是基本步骤: - **交集**:对于两个链表,遍历它们,只保留同时存在于两个链表中的节点,形成一个新的链表。 - **并集**:遍历第一个链表,然后遍历第二个链表,将所有节点添加到新的链表中,不检查是否已经存在。 - **差集**:首先计算并集,然后再遍历一次第一个链表,移除那些在第二个链表中存在的节点。 以下是简单的伪代码示例: ```python # 假设ListNode是一个链表节点类 def sort_linked_list(head): # 实现排序... def intersect_lists(list1_head, list2_head): # 创建空链表存储结果 result = ListNode(None) current = result while list1_head and list2_head: if list1_head.val <= list2_head.val: current.next = list1_head list1_head = list1_head.next else: current.next = list2_head list2_head = list2_head.next current = current.next return result.next # 对于并集和差集,需要先做并集再做差集 def union_and_difference(list1_head, list2_head): union_result = intersect_lists(list1_head, list2_head) difference_result = copy.deepcopy(list1_head) # 或者从头开始遍历list1 current = union_result while current: next_in_list1 = find_node_in_list(difference_result, current.val) if not next_in_list1: difference_result.next = current difference_result = difference_result.next current = current.next return union_result, difference_result ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值