142.环形链表II
力扣题目链接(opens new window)
题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
解法1:
数学逻辑 先求快慢指针相遇点,再由一个指针从头开始遍历,另一个从相遇点开始遍历,相遇及找到入环点(证明略,找官方网址或代码随想录)
/**
* 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*p=head;
ListNode*q=head;
while(q!=nullptr&&q->next!=nullptr)
{
q=q->next->next;
p=p->next;
if(q==p){
ListNode*index1=head;
ListNode* index2=q;
while(index1!=index2)
{
index1=index1->next;
index2=index2->next;
}
return index2;
}
}
return nullptr;
}
};
时间复杂度为O(n),空间复杂度为O(1)。
https://leetcode.cn/problems/linked-list-cycle-ii/solution/huan-xing-lian-biao-ii-by-leetcode-solution/
解法2 哈希表
时间复杂度,0(n),空间复杂度O(n)