选择了最简单的冒泡排序 
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        char[] chars = (in.next() + in.next()).toCharArray();
        sort(chars);
        for (int i = 0; i < chars.length; i++) {
            if (isHexChar(chars[i])) {
                chars[i] = int2char(reverse(char2Int(chars[i])));
            }
        }
        System.out.println(String.valueOf(chars));
    }

    static void sort(char[] chars) {
        for (int i = 0; i < chars.length; i++) {
            for (int j = 0, k = 1; j + 2 < chars.length - i ||
                    k + 2 < chars.length - i; j += 2, k += 2) {
                if (j + 2 < chars.length - i && chars[j] > chars[j + 2]) {
                    swap(chars, j, j + 2);
                }
                if (k + 2 < chars.length - i && chars[k] > chars[k + 2]) {
                    swap(chars, k, k + 2);
                }
            }
        }
    }

    static boolean isHexChar(char c) {
        return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F');
    }

    static char int2char(int i) {
        if (0 <= i && i <= 9) {
            return (char)(i + '0');
        }
        return (char)(i - 10 + 'A');
    }

    static int char2Int(char c) {
        if ('0' <= c && c <= '9') {
            return c - '0';
        }
        return c - ((c < 'a') ? 'A' : 'a') + 10;
    }

    static int reverse(int n) {
        int fst = (1 << 3) & n;
        int snd = (1 << 2) & n;
        int trd = (1 << 1) & n;
        int foth = 1 & n;
        if (!((fst > 0 && foth > 0) || (fst == 0 && foth == 0))) {
            fst >>= 3;
            foth <<= 3;
        }
        if (!((snd > 0 && trd > 0) || (snd == 0 && trd == 0))) {
            snd >>= 1;
            trd <<= 1;
        }
        return fst | snd | trd | foth;
    }

    static void swap(char[] arr, int i, int j) {
        char temp = arr[j];
        arr[j] = arr[i];
        arr[i] = temp;
    }
}