若是在链表中求倒数第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); } }