https://leetcode-cn.com/problems/linked-list-cycle-ii/
https://leetcode-cn.com/problems/find-the-duplicate-number/
https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/submissions/
第一道题是环形链表
第二道题,每一个数字可以看作是next下标,有一个重复数字,所以可以看作是链表有环。
/**
* 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) {
if(head==NULL)
return NULL;
ListNode*p1=head;
ListNode*p2=head;
while(1){
p1=p1->next;
p2=p2->next;
if(p2==NULL)
return NULL;
p2=p2->next;
if(p2==NULL)
return NULL;
if(p1==p2)
break;
}
p1=head;
while(p1!=p2){
p1=p1->next;
p2=p2->next;
}
return p1;
}
};
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int slow=0;
int fast=0;
do{
slow=nums[slow];
fast=nums[fast];
fast=nums[fast];
}while(slow!=fast);
slow=0;
while(slow!=fast){
slow=nums[slow];
fast=nums[fast];
}
return slow;
}
};
把数字换到对应的位置,如果冲突,则说明重复
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int n=nums.size();
for(int i=0;i<n;i++){
if(nums[i]==i)
continue;
if(nums[nums[i]]==nums[i])
return nums[i];
swap(nums[i],nums[nums[i]]);
}
return -1;
}
};