可以理解成数组版本的 环形链表 II 更多详细思路可见以上超链接。 如何转化成逻辑上的链表? nums[i] 是 第 i 个结点的 next 指针 构造成一个有 nums.length - 重复次数 个结点的链表 如此,该链表中肯定成环(可以自己画数组转化成逻辑上的链表图理解下) 时间复杂度 O(n),空间复杂度 O(1),未修改数组, 重复证明(slow 路程超过 nums.length / 2即可) class  Solution  { public  int  findDuplicate ( int [ ]  nums)  { int  slow =  nums[ 0 ] ,  fast =  nums[ 0 ] ; do  { slow =  nums[ slow] ; fast =  nums[ nums[ fast] ] ; }  while ( slow !=  fast) ; fast =  nums[ 0 ] ; while ( fast !=  slow) { fast =  nums[ fast] ; slow =  nums[ slow] ; } return  fast; } 
} 
主要是不能修改原数组  数字转换成节点,重复数字相当于多个数字表示一个节点  根据存储值对应下标 ,来构造链表关系。 class  Solution  { public  int  findDuplicate ( int [ ]  nums)  { int  slow =  nums[ 0 ] ,  fast =  nums[ 0 ] ; do  { slow =  nums[ slow] ; fast =  nums[ nums[ fast] ] ; }  while ( slow !=  fast) ; fast =  nums[ 0 ] ; while ( slow !=  fast)  { fast =  nums[ fast] ; slow =  nums[ slow] ; } return  slow; } 
}