第十二章:排序

面试题74:合并区间

题目

输入一个区间的集合,请将重叠的区间合并。每个区间用两个数字比较,分别表示区间的起始和结束位置。例如,输入区间[[1, 3], [4, 5], [8, 10], [2, 6], [9, 12], [15, 18]],合并重叠的区间之后得到[[1, 6], [8, 12], [15, 18]]。

参考代码

public int[][] merge(int[][] intervals) {
    Arrays.sort(intervals, (i1, i2) -> i1[0] - i2[0]);

    List<int[]> merged = new LinkedList<>();
    int i = 0;
    while (i < intervals.length) {
        int[] temp = new int[] {intervals[i][0], intervals[i][1]};
        int j = i + 1;
        while (j < intervals.length && intervals[j][0] <= temp[1]) {
            temp[1] = Math.max(temp[1], intervals[j][1]);
            j++;
        }

        merged.add(temp);
        i = j;
    }

    int[][] result = new int[merged.size()][];
    return merged.toArray(result);
}

面试题75:数组相对排序

题目

输入两个数组arr1和arr2,其中arr2里的每个数字都唯一并且也都是arr1中的数字。请将arr1中的数字按照arr2中数字的相对顺序排序。如果arr1中的数字在arr2中没有出现,那么将这些数字按递增的顺序排在后面。假设数组中的所有数字都在0到1000的范围内。例如,输入的数组arr1和arr2分别是[2, 3, 3, 7, 3, 9, 2, 1, 7, 2]和[3, 2, 1],则arr1排序之后为[3, 3, 3, 2, 2, 2, 1, 7, 7, 9]。

参考代码

面试题76:数组中第k大的数字

题目

请从一个乱序的数组中找出第k大的数字。例如数组[3, 1, 2, 4, 5, 5, 6]中第3大的数字是5。

参考代码

面试题77:链表排序

题目

输入一个链表的头节点,请将该链表排序。例如,输入图12.4(a)中的链表,该链表排序后如图12.4(b)所示。

图12.4

图12.4:链表排序。(a)一个有6个结点的链表。(b)排序后的链表。

参考代码

面试题78:合并排序链表

题目

输入k个排序的链表,请将它们合并成一个排序的链表。例如,输入三个排序的链表如图12.5(a)所示,将它们合并之后得到的排序的链表如图12.5(b)所示。

图12.5

图12.5:合并排序链表。(a)三个排序的链表。(b)合并后的链表。

参考代码

解法一

解法二

Last updated