| 
 
 今天主要做了这两道题  链表中环的入口结点_牛客题霸_牛客网 (nowcoder.com)、  287. 寻找重复数 - 力扣(LeetCode) (leetcode-cn.com)  
1.链表中环的入口节点 
描述 
给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。  数据范围:?n\le10000n≤10000,1<=结点值<=100001<=结点值<=10000  要求:空间复杂度?O(1)O(1),时间复杂度?O(n)O(n)  
例如,输入{1,2},{3,4,5}时,对应的环形链表如下图所示:     可以看到环的入口结点的结点值为3,所以返回结点值为3的结点。  
思路如下  
   
public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead) {
        if(pHead == null) return null;
        ListNode slow=pHead;
        ListNode fast=pHead;
        while(fast!=null&&fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
            if(fast==slow) break;
        }
        if(fast==null||fast.next==null) return null;
        slow=pHead;
        while(slow!=fast){
            slow=slow.next;
            fast=fast.next;
        }
        return slow;
    }
}
  
2.寻找重复数 
给定一个包含?n + 1 个整数的数组?nums ,其数字都在 1 到 n?之间(包括 1 和 n),可知至少存在一个重复的整数。  假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。  你设计的解决方案必须不修改数组 nums 且只用常量级 O(1) 的额外空间。  
示例 1:
输入:nums = [1,3,4,2,2]
输出:2
示例 2:
输入:nums = [3,1,3,4,2]
输出:3
示例 3:
输入:nums = [1,1]
输出:1
示例 4:
输入:ums = [1,1,2]
输出:1
  
我的思路,先排序,然后找到两两相同。或者直接用Hash表统计数量,但与题目要求相冲突。  后根据大神解题思路,巧用快慢指针求解。  
class Solution {
    public int findDuplicate(int[] nums) {
        int slow = 0, fast = 0;
        do {
            slow = nums[slow];
            fast = nums[nums[fast]];
        } while (slow != fast);
        slow = 0;
        while (slow != fast) {
            slow = nums[slow];
            fast = nums[fast];
        }
        return slow;
    }
}
  
思路如下  
快慢指针思想, fast 和 slow 是指针, nums[slow] 表示取指针对应的元素
注意 nums 数组中的数字都是在 1 到 n 之间的(在数组中进行游走不会越界),
因为有重复数字的出现, 所以这个游走必然是成环的, 环的入口就是重复的元素, 
即按照寻找链表环入口的思路来做
 
                
                
                
        
        
    
 
 |