LeetCode:证明环型链表与找出入环的第一个节点

在这里插入图片描述

bool hasCycle(struct ListNode *head) {
    
    
    struct ListNode *fast=head;
    struct ListNode *slow=head;
    while(fast&&fast->next)
    {
    
    
        slow=slow->next;
        fast=fast->next->next;
        //快慢指针相遇了说明有环
    if(slow==fast)
    {
    
    
        return true;
    }
    
    }
   
    return false;
}

第二道题是第一道题的进阶
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef  struct ListNode  ListNode;
struct ListNode *detectCycle(struct ListNode *head) {
    
    
     ListNode *fast=head;
     ListNode *slow=head;
     ListNode *cur=head;
     //里面有fast->next->mext,判断条件加上fast->next,不能为NULL
     while(fast&&fast->next)
     {
    
    
         slow=slow->next;
         fast=fast->next->next;
         if(slow==fast)
         {
    
    
             break;
         }
     }
     //有可能传进来NULL,一个节点
     //也有可能没有环
     
     if(fast==NULL||slow!=fast||fast->next==NULL)
     {
    
    
         return NULL;
     }
     ListNode* meet=fast;
     //相遇点就是入环的第一个节点
     while(head!=meet)
     {
    
    
         head=head->next;
         meet=meet->next;
     }
     return head;

}

猜你喜欢

转载自blog.csdn.net/qq_45928272/article/details/112441162