力扣刷题|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)

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

总结:通过对卡哥链表的学习,确实学到很多东西,在录友群里交流也学会很多,果然一个学习效率永远低于一群人的学习效率,希望二刷的时候,能学到更多的知识点。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值