142.环形链表II
力扣题目链接(opens new window)
题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
先判断有无环:快慢指针
再找环的入口:数学推导->起始处到环起始入口的距离等于相遇位置到起始位置的距离,所以让两个指针分别指向head处和快慢指针相遇的位置,然后同时移动指针,直到他俩相遇
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*///快慢指针
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode* fast = head;ListNode* slow = head;while(fast != NULL && fast->next != NULL){fast = fast->next->next;//快指针每次走两步slow = slow->next;//慢指针每次走一步,快指针的速度是慢指针的速度的2倍if(slow==fast){//当慢指针追上快指针,说明一定存在环ListNode*L1 = fast;//用一个指针先指向相遇处ListNode*L2 = head;//用一个指针指向起始处while(L1!=L2){//当L1与L2相遇时,相遇处即为环的入口L1 = L1->next;L2 = L2->next;}return L1;}}return NULL;//有环时不可能有NULL,没环才会走到这}
};