当前位置: 首页 > news >正文

每日算法题【链表】:相交链表、环形链表、环形链表II

(13)输入两个链表,找出它们的第一个公共结点
  • [160. 相交链表 - 力扣(LeetCode)]:

  • 解题思路:

    相交链表:两个链表只要相交,其尾结点一定相同,否则就不相交。
    求交点:长的链表先走(长度差)步,再同时走,第一个相同的就是交点。

    /**
    * Definition for singly-linked list.
    * struct ListNode {
    *     int val;
    *     struct ListNode *next;
    * };
    */struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* tailA = headA;struct ListNode* tailB = headB;//遍历两个链表,得到节点数和尾结点int lenA = 1;while(tailA->next){++lenA;tailA = tailA->next;}int lenB = 1;while(tailB->next){++lenB;tailB = tailB->next;}//遍历到最后尾节点不相同则不相交if(tailA != tailB){return NULL;}int gap = abs(lenA - lenB);//长的先走差距步,在同时往后走找交点struct ListNode* longList = headA;struct ListNode* shortList = headB;if(lenA < lenB){shortList = headA;longList = headB;}while(gap--){longList = longList->next;}while(longList != shortList){longList = longList->next;shortList = shortList->next;}return longList;
    }
    

(14)判断是否为环形链表
  • [141. 环形链表 - 力扣(LeetCode)]:

  • 解题思路:

    首先,我们申请两个指针,一个是快指针fast(一次走两步),一个是慢指针slow(一次走一步)。

    其次,我们让两个指针向前遍历,会有两种情况。

    链表不成环,那么快指针fast就会走向空NULL。
    链表如果成环,快指针一次走两步,慢指针一次走一步。那么两个指针的距离会越来越小直至相遇。此时证明了链表成环。

    /*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
    bool hasCycle(struct ListNode *head) {//定义快慢指针指向链表头结点struct ListNode* Fast = head;struct ListNode* Slow = head;//当快指针遍历一遍没有指向空,说明链表带环while(Fast && Fast->next)//Fast && Fast->next都不能为空,因为Fast一次要走两步{//快指针一次走两步,慢指针一次走一步Fast = Fast->next->next;Slow = Slow->next;if(Fast == Slow){return true;}}return false;
    }
    

(15)返回环形链表的第一个节点
  • [142. 环形链表 II - 力扣(LeetCode)]:

  • 解题思路:

    首先,我们申请两个指针,一个是快指针fast(一次走两步),一个是慢指针slow(一次走一步)。

    其次,我们让两个指针向前遍历,当两指针相遇时,在相遇点放置一个相遇指针meet,然后通过循环,meet指针在相遇点走,head指针在头节点走,两指针相遇时,此点即为入环的第一个结点。

    /*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
    struct ListNode *detectCycle(struct ListNode *head) {//定义快慢指针指向链表头结点struct ListNode* Fast = head;struct ListNode* Slow = head;//当快指针遍历一遍没有指向空,说明链表带环while(Fast && Fast->next)//Fast && Fast->next都不能为空,因为Fast一次要走两步{//快指针一次走两步,慢指针一次走一步Fast = Fast->next->next;Slow = Slow->next;if(Fast == Slow){//再相遇点设置一个meet指针struct ListNode* meet = Fast;while(head != meet){//并且让meet和head同时往后走,相遇时就是入环节点head = head->next;meet = meet->next;}return head;}}return NULL;
    }
    
http://www.dtcms.com/a/348009.html

相关文章:

  • 鸿蒙分布式计算实战:用 ArkTS+Worker 池落地可运行任务管理 Demo,从单设备到跨设备全方案
  • [二维前缀和]1277. 统计全为 1 的正方形子矩阵
  • HarmonyOS实战(DevEco AI篇)—深度体验DevEco CodeGenie智能编程助手
  • Function + 枚举 + Map:轻量路由器的最佳实践
  • ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘192.168.24.96‘ (10060)
  • 基于Java、GeoTools与PostGIS的对跖点求解研究
  • 大数据毕业设计选题推荐:基于Spark+Django的学生创业数据分析可视化系统详解 毕业设计/选题推荐/深度学习/数据分析/数据挖掘/机器学习/随机森林
  • 网络编程socket-Udp
  • Linux网络启程
  • Java基础(十四)分布式
  • 《Distilling the Knowledge in a Neural Network》论文PDF分享, 2015 年,谷歌提出了 “知识蒸馏” 的概念
  • 深入解析Apache Kafka的核心概念:构建高吞吐分布式流处理平台
  • 07-分布式能力与多设备协同
  • Lucene 与 Elasticsearch:从底层引擎到分布式搜索平台的演进
  • Flink提交作业
  • (Redis)内存淘汰策略
  • Elastic APM vs Apache SkyWalking vs Pinpoint:APM性能监控方案对比分析与最佳实践
  • 深度学习之第二课PyTorch与CUDA的安装
  • 华为云Stack环境中计算资源,存储资源,网络资源发放前的准备工作(上篇)
  • 【软考架构】云计算相关概念
  • 嵌入式系统bringup通用流程
  • SpringBoot的学生学习笔记共享系统设计与实现
  • 鸿蒙中应用闪屏解决方案
  • 从Android到鸿蒙:一场本应无缝的转型-优雅草卓伊凡
  • Flink 实时加购数据“维表补全”实战:从 Kafka 到 HBase 再到 Redis 的完整链路
  • 设计模式:工厂模式
  • 3.4 磁盘存储器 (答案见原书 P194)
  • STM32H723Zx OCTO-SPI(OSPI) 读写 W25Q64
  • fastmcp 客服端远程MCP服务调用;多工具 MCP服务情景案例;集成fastapi服务
  • Vue.js 核心机制深度学习笔记