給定一個鏈表,返回鏈表開始入環的第一個節點。 如果鏈表無環,則返回 NULL

題目:
在這裏插入圖片描述
分析
返回入環的第一個節點之前我們要判斷是否成環,判斷方法如下
在這裏插入圖片描述
判斷了是否成環之後怎麼找到成環的第一個節點呢,分析如下
在這裏插入圖片描述
代碼






/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    //先判斷是不是環,如果是找出第一次相遇的位置
    if(head==NULL||head->next==NULL)
    return NULL;//成環最少兩個
    struct ListNode *slow=head;
    struct ListNode *fast=head;
    while(fast)
    {
        slow=slow->next;
        if(fast->next==NULL)//防止越界
        return NULL;
        fast=fast->next->next;
         if(slow==fast)//重合了
        break;
    }
    if(fast==NULL)
    return fast;
    //此時得到第一次相遇的位置
    struct ListNode *dst=head;//從原點開始出發
    while(1)
    {
        if(dst==slow)//找到了,返回
        return dst;
        dst=dst->next;
        slow=slow->next;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章