【链表面试题】求两个已排序单链表中相同的数据

整体思路

1.分别创建两个结点变量cur1,cur2
2.cur1->data和cur2->data比较
3.如果cur1->data大于cur2->data
cur2 = cur2->next
4.如果cur1->data小于cur2->data
cur1 = cur1->next
5.如果cur1->data= cur2->data
cur1和cue2 同时向后走

代码

//求两个已排序单链表中相同的数据。void UnionSet(Node* l1,Node* l2);
void PrintIntersection(SListNode *List1, SListNode *List2)
{
	SListNode *cur1 = List1;
	SListNode *cur2 = List2;
	while (cur1 != NULL && cur2 != NULL)
	{
		if (cur1->data < cur2->data)
		{
			cur1 = cur1->Next;
		}
		else if (cur1->data > cur2->data)
		{
			cur2 = cur2->Next;
		}
		else
		{
			printf("  %d  ", cur1->data);
			cur1 = cur1->Next;
			cur2 = cur2->Next;
		}
	}
}

测试

void TestPrintIntersection()
{
	SListNode*List1 = NULL, *List2 = NULL;
	SListPushBack(&List1, 1);
	SListPushBack(&List1, 3);
	SListPushBack(&List1, 4);
	SListPushBack(&List1, 6);

	SListPushBack(&List2, 1);
	SListPushBack(&List2, 5);
	SListPushBack(&List2, 6);

	PrintIntersection(List1,List2);
}

结果

在这里插入图片描述

进阶

如果相等的数字重复出现,这个数字只出现一次

void TestPrintIntersection()
{
	SListNode*List1 = NULL, *List2 = NULL;
	SListPushBack(&List1, 1);
	SListPushBack(&List1, 3);
	SListPushBack(&List1, 3);
	SListPushBack(&List1, 4);
	SListPushBack(&List1, 6);

	SListPushBack(&List2, 1);
	SListPushBack(&List2, 1);
	SListPushBack(&List1, 3);
	SListPushBack(&List2, 5);
	SListPushBack(&List2, 6);

	PrintIntersection(List1,List2);
}


//求两个已排序单链表中相同的数据。void UnionSet(Node* l1,Node* l2);
void PrintIntersection(SListNode *List1, SListNode *List2)
{
	SListNode *cur1 = List1;
	SListNode *cur2 = List2;
	DataType data;
	while (cur1 != NULL && cur2 != NULL)
	{
		if (cur1->data < cur2->data)
		{
			cur1 = cur1->Next;
		}
		else if (cur1->data > cur2->data)
		{
			cur2 = cur2->Next;
		}
		else
		{
			printf("  %d  ", cur1->data);
			data = cur1->data;
			while (cur1 != NULL && cur1->data == data)
			{
				cur1 = cur1->Next;
			}
			while (cur2 != NULL && cur2->data == data)
			{
				cur2 = cur2->Next;
			}
		}
	}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值