1.判断链表中是否有环

  • Post author:
  • Post category:其他

思路:快慢指针来解决,如果有环,那么最后肯定会是node1==node2

思路:

利用快慢指针 slow = slow.next;

                        fast = fast.next.next;

注意循环条件 while(fast != null && fast.next != null)

                      因为涉及到fast.next.next,所以需要判定fast.next是否为空

我大概看了一下没有我这么做的,我的方法更暴力简单,每次遍历一个数据,就把那个节点的val值换成None,然后一直遍历直到遇到节点为None或者节点的val为None为止,因为输入里似乎没有val为None的情况,所以直接判断退出循环的原因即可判断。

快慢指针,时间空间均超过了90%,不知道代码还能不能简化一下

两个指针,一个一次走一步,一个一次走两步,两个指针相遇的话就是有环

解法1:殊途同归法

解法2:快慢指针

啊这,在没有考虑输入链表为空的时候,他会报段错误。所以这个要小心,并不是自己代码有问题,可能是测试用例中使用了非法输入,所以要小心。新手刚开始刷题的我,确实被自己气到。

快慢指针,如果有环两个指针一定会相遇。如果快指针的next碰见null或者next的next碰见null就是没有环。

/*
快慢指针,从头走,一个走一步,一个走两步,如果有环,则快指针会在环内再次追上慢指针,
即快慢指针会相遇,否则会有指针指到null,即走到结尾。

*/
方法一:通过常规快慢指针判断
方法二:使用列表判断是否下一步保存值在里面,会牺牲空间

#include <stdbool.h>
/**

  • struct ListNode {
  • int val;
  • struct ListNode *next;
  • };
  • C语言声明定义全局变量请加上static,防止重复定义
    */

/**
*

  • @param head ListNode类

  • @return bool布尔型
    /
    bool hasCycle(struct ListNode
    head ) {
    // write code here
    struct ListNode *slow=head,*fast=head;
    while(){

     if(){
         return true;
     }
    

    }
    return false;

}


#include <stdbool.h>
/**

  • struct ListNode {
  • int val;
  • struct ListNode *next;
  • };
  • C语言声明定义全局变量请加上static,防止重复定义
    */

/**
*

  • @param head ListNode类
  • @return bool布尔型
    /
    bool hasCycle(struct ListNode
    head ) {
    // write code here
    struct ListNode *slow=head,*fast=head;
    while(fast&&fast->next){
    slow=slow->next;
    fast=fast->next->next;
    if(slow==fast){
    return true;
    }
    }
    return false;

}



版权声明:本文为qq_39196431原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。