【oj题】环形链表

目录

一. OJ链接: 环形链表

【思路】 快慢指针

​编辑【扩展问题】 为什么快指针每次走两步,慢指针走一步可以解决问题?

 ​编辑【扩展问题】快指针一次走3步,走4步,...n步行吗? 

二. OJ链接:环形链表|| 


一. OJ链接: 环形链表

【思路】 快慢指针

即慢指针一次走一步,快指针一次走两步,两个指针从链表起始位置开始运行,如果链表带环则一定会在环中相遇,否则快指针率先走到链表的末尾。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) 
{
    ListNode* fast , *slow;
    fast = slow = head;
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        if(fast == slow)
        return true;
    }   
    return false;
}

【扩展问题】 为什么快指针每次走两步,慢指针走一步可以解决问题?

        如果链表不带环,两个指针一定不会相遇,因为fast = 2slow

        假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。

        当慢指针刚进环时,可能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度-1。

        此时,两个指针每移动 一次,之间的距离就缩小一步。因此,在慢指针走到一圈之前, 快指针肯定是可以追上慢指针的,即相遇。

 【扩展问题】快指针一次走3步,走4步,...n步行吗? 

假设快指针一次走3步,慢指针一次走1步

同理可证,快指针走4,5……也行 

二. OJ链接:环形链表|| 


相遇时,slow指针与fast指针走的路程 

 head指针走L步,meet指针走C-N步,head指针和meet指针相遇,此时就是环的第一个节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* detectCycle(struct ListNode* head) {
    struct ListNode *slow = head, *fast = head;
    while (fast != NULL && fast->next) 
    {
        slow = slow->next;
        fast = fast->next->next;
        if (fast == slow) {
            struct ListNode *ptr = head, *meet = slow;
            while (ptr != meet) {
                ptr = ptr->next;
                meet = meet->next;
            }
            return ptr;
        }
    }
    return NULL;
}

 一键三连~

<think>好的,用户想查找SWUST OJ平台上的问623的相关信息或解决方案。首先,我需要确认自己是否了解这个问。由于SWUST OJ是一个在线判平台,不同的问编号对应不同的目,但具体的目内容可能需要访问平台才能查看。由于我无法直接访问外部网站或数据库,我需要指导用户如何自行查找相关信息。 接下来,用户可能需要知道如何通过目编号查找问。通常,OJ平台会有搜索功能,用户可以直接输入问编号623进行搜索。如果用户不知道如何操作,我可以提供步骤,比如访问SWUST OJ官网,使用搜索栏输入623,然后查看问描述。 另外,考虑到用户可能需要解决方案,常见的做法是检查问所在的分类或标签。例如,问623可能属于动态规划、贪心算法、数据结构等。如果用户能提供目名称或关键内容,我可以给出更具体的建议。例如,如果是关于二叉树遍历的问,可以推荐相应的算法实现。 同时,用户可能需要参考其他人的解或讨论。建议用户查看平台的讨论区,或者使用搜索引擎查找“SWUST OJ 623 solution”之类的关键词,可能会找到博客、GitHub仓库或论坛帖子。例如,一些编程竞赛社区可能有用户分享他们的代码和思路。 此外,确认目是否存在常见的陷阱或测试用例也很重要。例如,某些问可能需要处理大数运算或边界条件,提醒用户在解决问时注意这些细节。如果问涉及特定算法,可以简要解释该算法的关键点,帮助用户理解如何实现。 如果用户无法找到相关信息,可能需要联系平台的管理员或助教寻求帮助。或者,用户可以提供目描述,这样我可以协助分析问并给出解决思路。 总结一下,我的回答需要引导用户如何自行查找问623的信息,并提供一般性的解建议,同时建议他们利用外部资源和社区支持。同时,保持回答的结构清晰,分步骤说明,确保用户能够逐步解决问。</think>关于SWUST OJ623的解决方案,由于我无法直接访问具体目内容,以下提供通用解建议和查找方法: ### 问定位步骤 1. **访问SWUST OJ官网** 通过浏览器访问`https://www.oj.swust.edu.cn/`,在搜索栏输入问编号`623`,查看目描述、输入输出样例及数据范围[^1] 2. **分析目类型** 根据目描述判断其所属算法分类(例如动态规划、图论或字符串处理),以下为常见类型参考: - 动态规划:目中出现"最大值"、"最少操作次数"等关键词 - 图论:涉及节点、边、路径等描述 - 数据结构:要求实现特定结构如二叉树、堆栈等 3. **参考开源平台** 在GitHub搜索`SWUSTOJ623`,部分用户会上传解代码库,例如: ```python # 示例代码结构(假设为排序问) def problem623_solution(): n = int(input()) arr = list(map(int, input().split())) print(' '.join(map(str, sorted(arr)))) ``` ### 通用解建议 1. **边界条件处理** 特别注意数据范围说明,例如当$n \leq 10^6$时需要选择$O(n \log n)$算法 2. **测试用例验证** 使用目提供的样例进行验证,并补充以下测试案例: - 空输入 - 极值输入(如最大值/最小值) - 特殊数据结构(如完全二叉树、环形链表) 3. **性能优化** 对于时间敏感型问,可参考以下优化策略: ```c++ // C++示例:关闭同步流加速IO ios::sync_with_stdio(false); cin.tie(nullptr); ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值