力扣刷题|L24. 两两交换链表中的节点 、L19.删除链表的倒数第N个节点 、L面试题 02.07. 链表相交 、L142.环形链表II

这篇具有很好参考价值的文章主要介绍了力扣刷题|L24. 两两交换链表中的节点 、L19.删除链表的倒数第N个节点 、L面试题 02.07. 链表相交 、L142.环形链表II。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天的刷题最大的收获,便是学会了在群里跟大家进行讨论,这样得到的答案,往往能更快的提高效率,希望自己能继续坚持下去。

L24. 两两交换链表中的节点https://leetcode.cn/problems/swap-nodes-in-pairs/submissions/

本题主要考虑双指针法,也就是如何判断虚拟节点不动的情况,这是一个难点,可以利用另一个节点来等于虚拟节点,然后再利用两个局部变量,来完成还原,这样虚拟节点还是没有变,但是其指向的值会发生变化,以后返回某个值,只需要将虚拟节点固定,利用一个值来取代该值,对该值进行变化即可

class Solution {
public:
	ListNode* swapPairs(ListNode* head)
	{
		//定义一个虚拟结点
		//将就一个点,保证一个点不动,也就是虚拟节点一直要有一个值等待着,不能让他随着一起动
		//不能三指针,两指针就好了
		ListNode* vir = new ListNode(0, head); 
		ListNode* temp1 = NULL;
		ListNode* temp2 = NULL;
		ListNode* result = vir;
		//result->next;//将头结点给cur
		//ListNode* pre = result->next->next;//将头结点下一节点给pre
		while (result->next!=NULL && result->next->next != NULL)
		{
			temp1 = result->next->next->next;//记录跳过两个节点的第一个点就好了
			//现在开始进行交换
			temp2 = result->next;

			result->next = result->next->next;
			result->next->next = temp2;
			result->next->next->next = temp1;

			result = result->next->next;
		}
		return vir->next;
	}
};

L19.删除链表的倒数第N个节点 24. 两两交换链表中的节点 - 力扣(LeetCode)

本题注重采用双指针的方式

一开始自己卡在指针的跳转,这一块有点迷,后面一点一点的也就想出来了,还是简单的一个交换法,交换两指针

class Solution {
public:
	ListNode* swapPairs(ListNode* head)
	{
		//定义一个虚拟结点
		//将就一个点,保证一个点不动,也就是虚拟节点一直要有一个值等待着,不能让他随着一起动
		//不能三指针,两指针就好了
		ListNode* vir = new ListNode(0, head); 
		ListNode* temp1 = NULL;
		ListNode* temp2 = NULL;
		ListNode* result = vir;
		//result->next;//将头结点给cur
		//ListNode* pre = result->next->next;//将头结点下一节点给pre
		while (result->next!=NULL && result->next->next != NULL)
		{
			temp1 = result->next->next->next;//记录跳过两个节点的第一个点就好了
			//现在开始进行交换
			temp2 = result->next;

			result->next = result->next->next;
			result->next->next = temp2;
			result->next->next->next = temp1;

			result = result->next->next;
		}
		return vir->next;
	}
};

L面试题 02.07. 链表相交 https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/

本题虽然很简单,但是自己犯了一个错误,那便是对每个指针的一个值进行了修改,也怪自己没有深刻理解链表的一个定义

此外自己在本次中,第一次使用了一个模版,以前都是只相关性的学习过,并未真正意义上的使用过

class Solution {
public:
	template<typename T>
	void Swap(T& A, T& B)
	{
		T temp = A;
		A = B;
		B = temp;
	}
	ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
		int sizeA = getList(headA);
		int sizeB = getList(headB);
		ListNode* curA = headA;
		ListNode* curB = headB;
		if (sizeB > sizeA)
		{
			swap(sizeA, sizeB);
			swap(curA, curB);
		}
		int subsize = sizeA - sizeB;
		while (subsize--)
		{
			curA = curA->next;
		}
		while (curA != NULL)
		{
			if (curA == curB)
			{
				return curA;
			}
			curA = curA->next;
			curB = curB->next;
		}
		return NULL;
	}
	//得到链表的长度
	int getList(ListNode* list)
	{
		ListNode* solve = new ListNode(0);
		solve->next = list;
		while (solve->next != NULL)
		{
			solve->val++;
			solve = solve->next;
		}
		return solve->val;
	}
};

class Solution {
public:
	template<typename T>
	void Swap(T& A, T& B)
	{
		T temp = A;
		A = B;
		B = temp;
	}
	ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
		int sizeA = getList(headA);
		int sizeB = getList(headB);
		ListNode* curA = headA;
		ListNode* curB = headB;
		if (sizeB > sizeA)
		{
			Swap(sizeA, sizeB);
			Swap(curA, curB);
		}
		int subsize = sizeA - sizeB;
		while (subsize--)
		{
			curA = curA->next;
		}
		while (curA != NULL)
		{
			if (curA == curB)
			{
				return curA;
			}
			curA = curA->next;
			curB = curB->next;
		}
		return NULL;
	}
	//得到链表的长度
	int getList(ListNode* list)
	{
		ListNode* solve = new ListNode(0);
		solve->next = list;
		int size = 0;
		while (solve->next != NULL)
		{
			size++;
			solve = solve->next;
		}
		return size;
	}
};

L142.环形链表IIhttps://leetcode.cn/problems/swap-nodes-in-pairs/、

本题的结题思路真的有被惊艳到,卡哥的思路真的无敌

首先自己想了一下,可以判断出是否有环,但是无法找到起点,果然一切的理论都得建立在数学基础上,然后在卡哥的这一段代码处,思考了一会,发现跳转两个节点,那就得判断当前节点和下一节点都不为空,这样才能保证后面进行跳转的时候不会出错,就算fast->next->next为空,也没关系,这样才会跳出循环,之所以这样写,也算是避免有单个节点的链表

while (fast != NULL && fast->next != NULL)

最后代码全是照着卡哥的写的,在这就不放了

总结:通过对卡哥链表的学习,确实学到很多东西,在录友群里交流也学会很多,果然一个学习效率永远低于一群人的学习效率,希望二刷的时候,能学到更多的知识点。文章来源地址https://www.toymoban.com/news/detail-443184.html

到了这里,关于力扣刷题|L24. 两两交换链表中的节点 、L19.删除链表的倒数第N个节点 、L面试题 02.07. 链表相交 、L142.环形链表II的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包