首页 > 其他分享 >[Leetcode]返回链表开始入环的第一个节点

[Leetcode]返回链表开始入环的第一个节点

时间:2023-04-24 23:01:57浏览次数:52  
标签:入环 slow ListNode struct fast next 链表 meet Leetcode

力扣链接


[Leetcode]返回链表开始入环的第一个节点_快慢指针

思路一:快慢指针法

一个指针从相遇点走,一个指针从起始点走,会在入口点相遇.

[Leetcode]返回链表开始入环的第一个节点_快慢指针_02

最终代码:

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


        if(slow == fast)
        {
            struct ListNode* meet = slow;
            struct ListNode* start = head;


            while(meet != start)
            {
                meet = meet->next;
                start = start->next;
            } 
            return meet;


        }
    }
    return NULL;
}

思路二:

[Leetcode]返回链表开始入环的第一个节点_快慢指针_03


/**
 * 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,* tailB = headB;
    int lenA = 1, lenB = 1;
    while(tailA->next)
    {
        tailA = tailA->next;
        ++lenA; 
    }
    while(tailB->next)
    {
        tailB = tailB->next;
        ++lenB;
    }
    if(tailA != tailB)
    {
        return NULL;
    }


    int gap = abs(lenA - lenB);
    struct ListNode* longList = headA,* shortList = headB;
    if(lenA<lenB)
    {
        longList = headB;
        shortList = headA;
    }
    while(gap--)
    {
        longList= longList->next;
    }


    while(longList !=shortList)//比较的是地址
    {
        longList = longList->next;
        shortList = shortList->next;
    }
    return longList;


}




struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *slow,* fast;
    fast = slow = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;


        if(slow == fast)
        {
            //转换成lt1和lt2求交点
            struct ListNode* meet = slow;
            struct ListNode* lt1 = meet->next;
            meet->next = NULL;
            struct ListNode* lt2 = head;


            return getIntersectionNode(lt1,lt2);


        }
    }
    return NULL;
}

标签:入环,slow,ListNode,struct,fast,next,链表,meet,Leetcode
From: https://blog.51cto.com/u_15992140/6222006

相关文章

  • LeetCode 40.组合总和II
    1.题目:给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。示例 1:输入:candidates= [10,1,2,7,6,1,5],target= ......
  • leetcode 550 游戏玩法分析IV
    游戏玩法分析 selectround(avg(a.event_dateisnotnull),2)asfractionfrom(selectplayer_id,min(event_date)asevent_datefromactivitygroupbyplayer_id)aspleftjoinactivityasaonp.player_id=a.player_idanda.event_date=date_......
  • 【DP】LeetCode 221. 最大正方形
    题目链接221.最大正方形思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(即nu......
  • LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。前天刚举办2023年力扣杯个人SOLO赛,昨天周赛就出了一场Easy-Easy-Medium-Medium的水场,不得不说LeetCode是懂礼数的......
  • leetcode343. 整数拆分
    classSolution{public:intf[60];//f[i]记录i能拆出的最大乘积intintegerBreak(intn){for(inti=2;i<=n;i++)for(intj=1;j<i;j++)//枚举最后一个拆出的数字,这里不能只循环到i/2f[i]=max(f[i],max(j*f[i-j],j*(i-j)));......
  • leetcode377.组合总和IV
    classSolution{public:longlongf[1010];//f[i]表示总和为i的选法个数intcombinationSum4(vector<int>&nums,inttarget){intn=nums.size();f[0]=1;for(inti=0;i<=target;i++)for(intj=0;j<n;j++)......
  • 快慢指针判断链表中是否存在循环
    给链表设置快慢两个指针,每次移动时,快指针的速度是慢指针的一倍。即每次快指针移动两次,慢指针移动一次。如果存在循环,快指针跑两圈就可以追上慢指针。 为什么不让慢指针停在原地等呢?因为循环有可能出现在中间位置。如此一来,循环过的位置就不必从头再循环。 整个过程的所有......
  • [Leetcode]找出链表公共结点
    力扣链接思路:先求出两个链表的长度差长链表先走差距步同时走,第一个地址相同的是交点代码:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*getIntersectionNode(structListNode*he......
  • leetcode-217-存在重复元素 题解
    题目描述给你一个整数数组nums。如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。示例1:输入:nums=[1,2,3,1]输出:true示例2:输入:nums=[1,2,3,4]输出:false示例3:输入:nums=[1,1,1,3,3,4,3,2,4,2]输出:true提......
  • 19删除链表的倒数第N个节点
    力扣刷题19.删除链表的倒数第N个节点--day4题目分析这道题目比较简单,熟练掌握单链表中删除节点的操作解法ListNode*removeNthFromEnd(ListNode*head,intn){ListNode*dummyHead=newListNode();dummyHead->next=head;ListNode*p=head;int......