判断链表是否相交并返回相交开始的结点,不考虑有环

解法:

通过遍历两链表到结束处的尾指针,并保存两链表的长度,判断尾指针是否相同,相同则是相交的链表,否则不相交。

在相交的基础上,根据链表的长度差,让较长的链表从头指针开始先移动差值的次数,然后两者指针一起移动,直到结点指针值相同,该值即为相交开始的结点。时间复杂度O(n),空间复杂度常数级。

自己做题时没想到该方法,主要是两个思路:

1.在遍历第一个链表时使用一个hashmap将结点指针存入,在遍历第二个链表时对每个结点判断是否在图中存在该结点,存在时该结点即为相交开始的结点,否则一直到结尾均无法查找到,查找过程使用hashmap,占用空间O(n),查找O(n),由于遍历链表也是O(n),最终空间复杂度O(n),时间复杂度O(n)。

2.先遍历第一个链表,记录尾指针和长度L1,然后遍历第二个链表,记录尾指针和长度L2,根据尾指针判断是否相交。在相交时,将链表长度较短的进行反转,然后再遍历较长的链表获取长度Lr。为表述方便,这里假定L1>=L2,则:

L1为链表1不重合部分,两链表重合起始处,链表重合后续部分;

Lr为链表1不重合部分,两链表重合起始处,链表2不重合部分;

显然,将L2后续重合部分设为La,非重合部分设为Lb,可以认为L1-Lr=La-Lb,结合La+Lb+1=L2,即可获得后续重合区长度La=(L1+L2-Lr-1)/2,根据该长度从反转完毕的L2头指针处移动Lk次,此时恰好为开始重合的结点。整体也可以认为是O(n)的时间复杂的和常数级的空间复杂度,但相当憨憨。

思路2存档记载自己的憨憨程度,根据思路大致实现,没有进行测试。

struct Linklist {
	int val;
	Linklist* next;
};

Linklist* getNode(Linklist* L1, Linklist* L2, int Len1, int Len2) {
	//调用该函数时确定有重合,不做特殊处理
	Linklist* L2_ptr = L2, * L_re = nullptr, * L_next = nullptr;
	if (Len2 == 1)
		return L2;//短链长度为1且相交,直接返回1
	while (L2_ptr != nullptr) {//反转链表L2,最后L2_ptr指向尾指针后,L_re指向尾指针
		L_next = L2_ptr->next;
		L2_ptr->next = L_re;
		L_re = L2_ptr;
		L2_ptr = L_next;
	}
	Linklist* L1_ptr = L1;
	int Len_r = 0;
	while (L1_ptr != nullptr) {//重合部分已经反转,再次遍历L1获取长度
		L1_ptr = L1_ptr->next;
		++Len_r;
	}
	Len_r = (Len1 + Len2 - Len_r - 1) > 1;
	while (Len_r--)
		L_re = L_re->next;//L_re从L2尾指针开始,可以看成从尾指针后退Len_r步
	return L_re;
}

Linklist* judge(Linklist* L1, Linklist* L2) {
	if (L1 == nullptr || L2 == nullptr)
		return nullptr;//其中有空
	int Len1 = 0, Len2 = 0;
	Linklist* L1_ptr = L1, * L2_ptr = L2;
	while (L1_ptr != nullptr){//遍历链表L1,L1_ptr为尾指针
		L1_ptr = L1_ptr->next;
		++Len1;
	}
	while (L2_ptr != nullptr){//遍历链表L2,L2_ptr为尾指针
		L2_ptr = L2_ptr->next;
		++Len2;
	}
	if (L1_ptr != L2_ptr)
		return nullptr;//不重合
	//到达此处已经重合
	if (Len1 > Len2)
		return getNode(L1, L2, Len1, Len2);
	return getNode(L2, L1, Len2, Len1);//保证较长的链表放前面
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值