若是在链表中求倒数第k个的数,可以使用双指针法。即:设置两个指针i和j,先让j先于i走k个位置,然后i和j同时移动,直到j指向最后一个元素,那么i指向的即是链表中的倒数第k个元素。
/**
* @program: entrance_exam
* @description: 两个整数递增有序序列A,B分别有n个和m个元素,求第k大的数(k≥1&&k≤n+m),要求最佳的时间复杂度
* @author: TAO
* @create: 2018-05-30 08:30
**/
/**算法思想:1.符合归并排序的思想,直接将A,B进行归并排序,然后在新的数组里面寻找第k大的元素,时间复杂度0(m+n);
*
* 方法二:直接在a,b两个数组设置两个指针i,j,直接比较数组元素大小,若a[i]>b[j],则j++,否则i++
* 直到比较k次,即找到第k大的数
*
* */
class FindKth{
public FindKth(){}
private int []c=new int[7];
public int mergeSort(int []a,int []b,int k){
int m=0,i=0,j=0;
for(i=0,j=0;i<a.length&&j<b.length;){
if(a[i]>b[j])
c[m++]=b[j++];
else
c[m++]=a[i++];
}
while (i<a.length) c[m++]=a[i++];
while (j<b.length) c[m++]=b[j++]; //插入剩余的表中的数据
return c[k-1];
}
}
public class Exercise11 {
public static void main(String[] args) {
int []a=new int[]{1,3,7};
int []b=new int[]{3,6,8,9};//定义两个单增的数组
//int []c=new int[]{11,13,15,16};
FindKth findKth=new FindKth();
int kth=findKth.mergeSort(a,b,3);
System.out.println(kth);
}
}