【LeetCode_160】相交链表

【LeetCode_160】相交链表

刷爆LeetCode系列

LeetCode第160题:

github地址

有梦想的电信狗

前言

本文用C++实现LeetCode第160题


题目描述

题目链接https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

题目与思路分析

目标分析

  1. 给定两个单链表的头节点 headAheadB ,找出并返回两个单链表相交的起始节点
  2. 如果两个链表不存在相交节点,返回 nullptr
  3. 提高要求:时间复杂度为O(m + n),空间复杂度为O(1),其中mn分别为两个链表的长度

思路一:暴力解法

思路:两层循环:遍历链表A和链表B,将链表A中的每个结点的地址都和链表B中的每个结点的地址进行比较,如果地址相等,则相交。

操作

  • ListNode* curNode1 = headA, *curNode2 = headBcurNode1curNode2分别用于迭代遍历两个链表
  • 链表A中的每个节点需要和链表B中的每个结点进行比较
    • curNode1 == curNode2时:代表是相交的结点,返回当前结点即可
    • else:内层循环中,curNode2移向下一个节点
  • 内层循环结束一轮后
    • 链表A的curNode1向后移动:curNode1 = curNode1->next
    • 链表B的迭代结点回到链表B的头结点,准备进行下一轮遍历:curNode2 = headB;
  • 循环内没有return时,代表没有相交。循环结束后return nullptr;
  • 时间复杂度O(n^2),空间复杂度O(1)
while(curNode1){while(curNode2){if(curNode1 == curNode2)return curNode1;else curNode2 = curNode2->next;} curNode1 = curNode1->next; curNode2 = headB;}

思路二:快慢指针

思路快慢指针解法

  1. 先分别求两个链表的长度
  2. 长的链表的curNode指针先向后移动两个链表长度的差距步
  3. 两个迭代指针再同时移动,第一个地址相同的结点就是交点

操作

  • ListNode* curNode1 = headA, *curNode2 = headBcurNode1curNode2分别用于迭代遍历两个链表
  • 求链表长度的子函数
  • 分别求两个链表的长度
    • size_t lengthA = getLength(headA)size_t lengthB = getLength(headB);
  • 比较两个链表的长度,长的链表的curNode指针先移动差距步
  • 再让两个curNode指针同时移动,第一个相同的地址就是交点
  • 时间复杂度O(m + n),空间复杂度O(1)
private: size_t getLength(ListNode* list){ ListNode* curNode = list; size_t length =0;while(curNode){++length; curNode = curNode->next;}return length;}
在这里插入图片描述

代码实现

思路一:暴力解法

  • 暴力解法:时间复杂度O(n^2),空间复杂度O(1)
// 暴力解法 O(n^2)classSolution{public: ListNode*getIntersectionNode(ListNode* headA, ListNode* headB){ ListNode* curNode1 = headA,*curNode2 = headB;while(curNode1){while(curNode2){if(curNode1 == curNode2)return curNode1;else curNode2 = curNode2->next;} curNode1 = curNode1->next; curNode2 = headB;}returnnullptr;}};

思路二:快慢指针

  • 快慢指针解法:时间复杂度O(m + n),空间复杂度O(1),其中mn分别为两个链表的长度
// 时间复杂度为O(m + n)的解法classSolution{public: ListNode*getIntersectionNode(ListNode* headA, ListNode* headB){ ListNode* curNode1 = headA,*curNode2 = headB;// 分别求两个链表的长度 size_t lengthA =getLength(headA); size_t lengthB =getLength(headB);// 长的链表先走差距步if(lengthA > lengthB){ size_t gap = lengthA - lengthB;while(gap--) curNode1 = curNode1->next;}else{ size_t gap = lengthB - lengthA;while(gap--) curNode2 = curNode2->next;}// 两个链表再同时走,第一个相同的地址就是交点while(curNode1){if(curNode1 == curNode2)return curNode1;else{ curNode1 = curNode1->next; curNode2 = curNode2->next;}}returnnullptr;}private: size_t getLength(ListNode* list){ ListNode* curNode = list; size_t length =0;while(curNode){++length; curNode = curNode->next;}return length;}};

算法代码优化

  • 思路二代码优化:优化比较链表长度的逻辑,减少逻辑重复的代码
// 优化找长链表的逻辑 时间复杂度为O(m + n)的解法classSolution{public: ListNode*getIntersectionNode(ListNode* headA, ListNode* headB){ ListNode* curNode1 = headA,*curNode2 = headB;// 分别求两个链表的长度 size_t lengthA =getLength(headA); size_t lengthB =getLength(headB);// 长的链表先走差距步// 优化找长的链表的逻辑 ,假设A比B长,再加一个修正假设的逻辑 ListNode* longList = headA,*shortList = headB; size_t gap = lengthA - lengthB;if(lengthA < lengthB){ longList = headB; shortList = headA; gap = lengthB - lengthA;}// 长链表先走差距步while(gap--) longList = longList->next;// 两个链表再同时走,第一个相同的地址就是交点while(longList){if(longList == shortList)return longList;else{ longList = longList->next; shortList = shortList->next;}}returnnullptr;}private: size_t getLength(ListNode* list){ ListNode* curNode = list; size_t length =0;while(curNode){++length; curNode = curNode->next;}return length;}};

以上就是本文的所有内容了,如果觉得文章对你有帮助,欢迎 点赞⭐收藏 支持!如有疑问或建议,请在评论区留言交流,我们一起进步

分享到此结束啦
一键三连,好运连连!
你的每一次互动,都是对作者最大的鼓励!征程尚未结束,让我们在广阔的世界里继续前行! 🚀

Read more

【DeepSeek应用】100个 DeepSeek 官方推荐的工具箱

【DeepSeek应用】100个 DeepSeek 官方推荐的工具箱

【DeepSeek应用】Deepseek R1 本地部署(Ollama+Docker+OpenWebUI) 【DeepSeek应用】DeepSeek 搭建个人知识库(Ollama+CherryStudio) 【DeepSeek应用】100个 DeepSeek 官方推荐的工具箱 【DeepSeek应用】Zotero+Deepseek 阅读与分析文献 【DeepSeek应用】100个 DeepSeek 官方推荐的工具箱 * 1. DeepSeek 工具箱:应用程序 * 2. DeepSeek 工具箱:AI Agent 框架 * 3. DeepSeek 工具箱:RAG 框架 * 4. DeepSeek 工具箱:即时通讯软件 * 5. DeepSeek 工具箱:浏览器插件 * 6. DeepSeek 工具箱:

By Ne0inhk
假网站排全网第二,真官网翻五页都找不到!NanoClaw创始人破防:SEO之战,我快要输了

假网站排全网第二,真官网翻五页都找不到!NanoClaw创始人破防:SEO之战,我快要输了

整理 | 苏宓 出品 | ZEEKLOG(ID:ZEEKLOGnews) 自从 OpenClaw 爆火之后,各种“Claw”项目接连出现,其中以安全优化版 NanoClaw 最为知名。它的核心代码仅有 4000 行,却获得了 AI 大牛 Andrej Karpathy 的点赞。 可谁也没想到,这款口碑极佳的开源项目,近来竟被一个仿冒网站抢了风头。 投诉无门之下,NanoClaw 创始人 Gavriel Cohen 在 X 社交平台上无奈发文怒斥:谷歌搜索错误地将假网站排在真官网前面,不仅破坏了项目声誉,还埋下了严重的安全隐患,而他费尽心力,却只能哀叹一句——“我正在为自己的开源项目打 SEO 战,但我快要输了。” 那么,NanoClaw 究竟发生了什么?又是怎么走红的?事情还要从 OpenClaw

By Ne0inhk
曝Windows 12将于今年发布?以AI为核心、NPU成「硬件门槛」,网友吐槽:“不想要的全塞进来了”

曝Windows 12将于今年发布?以AI为核心、NPU成「硬件门槛」,网友吐槽:“不想要的全塞进来了”

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 当年,微软一句“Windows 10 将是最后一个版本”的表态,让不少用户以为 Windows 进入了“只更新、不换代”的时代。但几年过去,现实却完全不同。 在 Windows 11 发布之后,如今关于 Windows 12 的传闻再次密集出现。从内部代号、代码片段,到硬件厂商的暗示与 OEM 预热标签,种种线索拼在一起,勾勒出一个明显的趋势——这不会只是一次常规升级,而更像是一次围绕 AI 的平台级重构。 更关键的是,这次争议,可能远比当年 TPM 2.0 更大。 精准卡位 Windows 10 退场的时间?

By Ne0inhk
“裸奔龙虾”数量已达27万只,业内人士警告;AI浪潮下,中传“砍掉”翻译等16个专业;薪资谈判破裂,三星电子8.9万人要罢工 | 极客头条

“裸奔龙虾”数量已达27万只,业内人士警告;AI浪潮下,中传“砍掉”翻译等16个专业;薪资谈判破裂,三星电子8.9万人要罢工 | 极客头条

「极客头条」—— 技术人员的新闻圈! ZEEKLOG 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:[email protected]) 整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 一分钟速览新闻点! * “裸奔龙虾”已高达27万只!业内人士警告:一旦黑客入侵,敏感信息一秒搬空 * 阿里云 CTO 周靖人代管千问模型一号位,刘大一恒管理更多团队 * 中国传媒大学砍掉翻译、摄影等 16 个本科专业,直言教育要面向人机分工时代 * 雷军放话:小米将很快推出 L3、L4 的驾驶 * 消息称原理想汽车智驾一号位郎咸朋具身智能赛道创业 * vivo 前产品经理宋紫薇创业,瞄准 AI 时尚Agent,获亿元融资 * MiniMax 发布龙虾新技能,股价暴涨超 23% * 薪资谈判破裂,三星电子

By Ne0inhk