当前位置: 首页 > 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.xdnf.cn/news/1358785.html

相关文章:

  • 鸿蒙中点击完成时延分析
  • LeetCode 42.接雨水
  • response对象的elapsed属性
  • Elasticsearch Ruby 客户端故障排查实战指南
  • Bright Data MCP:突破AI数据获取限制的革命性工具
  • 阿里云 OSS 前端直传实战:表单上传 + Policy 模式详解
  • GD32VW553-IOT 测评和vscode开发环境搭建
  • 硬件开发_基于物联网的宠物猫饲养系统
  • 互联网大厂Java面试模拟:核心技术点深度解析
  • 极验demo(float)(二)
  • 从字节码层面剖析以太坊智能合约创建原理
  • EXCEL实现复制后倒序粘贴
  • 从Android到鸿蒙:一场本应无缝的转型-优雅草卓伊凡
  • iptables 防火墙核心知识梳理(附实操指南)
  • 【文献阅读】Land degradation drivers of anthropogenic sand and dust storms
  • 《一次高并发场景下疑难Bug的深度排查与复盘》
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十七)设置主题
  • AI代码生成器全面评测:六个月、500小时测试揭示最强开发助手
  • CI/CD持续集成及持续交付详解
  • 户外广告牌识别误报率↓79%!陌讯多模态融合算法在城市广告合规监测的实战解析
  • TEE-可信执行环境
  • 程序里的依赖和中间件的依赖冲突,怎么解决
  • C++20: std::span
  • 多线程下单例如何保证
  • elasticsearch 7.x elasticsearch是查询的数据量大于10000分页有问题还是es的库总量大于10000分页有?
  • 【软件安全】ARM64、x86、32 位与 64 位架构的区别、定义、应用背景
  • 安装gitlab
  • Dify 从入门到精通(第 53/100 篇):Dify 的分布式架构(进阶篇)
  • 线程整理文档
  • git学习