【前言】
今天是刷题打卡第47天!
未到终局,焉知生死,冲冲冲。
原题:环形链表 II(双指针)
题目描述:
示例1:
输入:head = [3,2,0,-4], pos = 1 输出:返回索引为 1 的链表节点 解释:链表中有一个环,其尾部连接到第二个节点。
示例2:
输入:head = [1,2], pos = 0 输出:返回索引为 0 的链表节点 解释:链表中有一个环,其尾部连接到第一个节点。
思路(快慢指针):
本题比较难理解,所以笔者特意画了出来,好好康康哦。
代码执行:
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode *detectCycle(struct ListNode *head) { struct ListNode* slow = head; struct ListNode* fast = head; //如果链表无环,跳出循环一定是fast == NULL || fast->next == NULL while(fast && fast->next)//先找第一次相遇点 { slow = slow->next; fast = fast->next->next; if(slow == fast) { break; } } //链表无环时的情况,如果有环,一定不会有NULL //注意哦,不是head == NULL || head->next != NULL if(fast == NULL || fast->next == NULL) { return NULL; } //相遇后即有环,此时使用两个指针,一个从头开始走 //一个从相遇点开始走,两者再次相遇处即为入口点 slow = head; while(slow != fast) { slow = slow->next; fast = fast->next; } return slow; }
结语
今天是刷题打卡第47天!
加油吧少年。