链表刷题(9-11)

news/2025/1/18 8:05:19/

目录

 相交链表

环形链表

环形链表Ⅱ


 相交链表

力扣

第一种思路:判断尾节点地址是否相同,时间复杂度为O(N^2)

第二种思路:(节点对齐)记录两个链表节点个数,再根据节点差设置两个快慢指针进行next节点比对。时间复杂度O(N)(3N)。

注意:逆置链表达改变了单链表结构(相交时next指向两个节点),行不通。

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode *curA = headA, *curB = headB;int lenA = 0,lenB = 0;//初始值设为0while(curA->next){lenA++;curA = curA->next;}while(curB->next){lenB++;curB = curB->next;}//尾不同if(curB != curA)return NULL;//尾相同int gap = abs(lenB - lenA);//绝对值absoulute//假设struct ListNode *longList = headA,*shortList = headB;if(lenA < lenB){longList = headB;shortList = headA;}while(gap--)//长的先走gap步{longList = longList->next;}while(longList != shortList){longList = longList->next;shortList = shortList->next;}return longList;
}

在计算长度的时候我们少计算了一个长度,但我们要求的是长度差,所以没有影响。 

当我们不知道哪个链表长的时候可以先假设其中一个链表大,另一个小,然后判断它们的长度做出假设失败的修改。

环形链表

力扣

这里有点像我们数学里的相遇问题,这里我们可以用快指针走两步,慢指针走一步的方式解决,最终它们终会相遇。

在进入环后,它们之间的距离每次缩小1最终会相遇。进环后二者距离为N,假设环有M个节点,则N<M(等于时相遇)。所以slow最坏走了接近一圈的时候二者必然相遇。

bool hasCycle(struct ListNode *head) {struct ListNode* slow = head,*fast = head;while(fast && fast->next)//注意顺序{slow = slow->next;fast = fast->next->next;if(slow == fast)return true;}return false;
}

附加:为什么fast要走两步,slow只用走一步?

假设fast走三步,slow只走一步,假设进环后它们的距离是N,那么它的追击可能会出现两种情况。

N为偶数:N,N-2,N-4 .... 4,2,0

这种情况是可以追上的。 

N为奇数:N,N-2,N-4 .... 3,1,-1

当它们的距离为-1,即fast反超slow一步时,此时的距离为M-1(M为环的节点个数)

若M-1为偶数,则可以追上,若M为奇数,则永远追不上。

结论:当fast走2步以上时,需要判断奇偶决定是否可以追上,步步逼近必然能追上。

环形链表Ⅱ

力扣

这道题在前面那道题的基础上增加了返回入环的第一个结点(存在环时)。这里有一个前人总结的结论:当快慢指针相遇的时候的指针与头指针一起向后走,它们再次相遇的位置就是入环的位置。为什么呢?我们来解释一下。

 

有几个注意点:当slow和fast相遇时,fast必然走了一圈以上(fast走的比slow快),然后利用两倍关系,解出L的值,然后根据图示它们一起行动就会在起点相遇。

struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* slow = head,*fast = head;while(fast && fast->next)//注意顺序{slow = slow->next;fast = fast->next->next;if(slow == fast){struct ListNode* meet = slow;while(meet != head){meet = meet->next;head = head->next;}return meet;}}return NULL;
}

http://www.ppmy.cn/news/630237.html

相关文章

商用车防冻液市场现状及未来发展趋势

商用车防冻液定义 商用车防冻液是一种专门为商用车辆设计的防冻液&#xff0c;旨在保护发动机和冷却系统。它是一种化学物质&#xff0c;通常是由乙二醇和水混合而成&#xff0c;以防止发动机在低温下结冰或在高温下过热。 商用车防冻液的主要作用是防止冷却系统中的水在低温下…

如何用rust实现一个异步channel

目录 前言思路实现功能代码实现 测试先引测试版包测试代码结果与分析思考 尾语 前言 使用通信来共享内存&#xff0c;而不是通过共享内存来通信 上面这句话&#xff0c;是每个go开发者在 处理多线程通信时 的座右铭&#xff0c;go甚至把实现这个理念的channel直接焊在编译器里&…

炫技亮点 Spring Websocket idle check原理

文章目录 原理配置附件Java_websocket空闲检测原理 Spring Websocket 是基于 WebSocket 协议的实现&#xff0c;它提供了一种在客户端和服务器之间实时双向通信的方式。其中&#xff0c;idle check&#xff08;空闲检查&#xff09;是一种机制&#xff0c;用于检测 WebSocket 连…

老版三国演义片尾曲 历史的天空 歌词

《历史的天空》 暗淡了刀光剑影 远去了鼓角铮鸣 眼前飞扬着一个个 鲜活的面容 湮没了黄尘古道 荒芜了烽火边城 岁月啊你带不走 那一串串熟悉的姓名 兴亡谁人定啊 盛衰岂无凭啊 一页风云散啊 变幻了时空 聚散皆是缘哪 离合总关情啊 担当生前事啊 何计身后评 长江有意化作泪…

新包青天 片尾曲 参人生哲理

天外有天比你高 大富贵比不上身体好 无忧无虑平常心到老 看得透想得开别爱计较 宽宏大量开口笑 多朋友要比多仇人好 让人一步世界大多了 真心好 真意好 久了总会被看到 不需要急着让别人知道 重承诺 重感情 友谊才是宝 尝过人情冷暖最明了 现在讲谁傻瓜言之过早 人会好心有好报…

电视剧 片尾曲 王学兵 - 爱是一场等待

实际上这部电视剧在央视一套还没有演完&#xff0c;不错。讲述的是三对不同年龄段男女之间的爱情婚姻生活&#xff0c;有着坚持&#xff0c;有着忍耐&#xff0c;有着勇气&#xff0c;也有着放弃… <完美>堪称电视版的“20、30、40”。成功执导过《不要和陌生人说话》、《…

阿帕鲁萨镇片尾曲

阿帕鲁萨镇片尾曲 阿帕鲁萨镇片尾曲 值得推荐&#xff01;旋律可以 666

《白蛇传》观后感

央视一台刚结束的神话连续剧《白蛇传》&#xff0c; 看完后还是很有感觉的&#xff0c;heroine刘涛的表现也是很不错的。 我并非为影评人员&#xff0c;所以今日造次纯属娱乐&#xff0c;只是想纪念一下白素珍和许仙之间的坚贞不摧的爱情&#xff08;这是很难得 的&#xff09…