1. 程式人生 > >求兩個有序連結串列的交集和差集

求兩個有序連結串列的交集和差集

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;
}