import java.util.Arrays;
import java.util.Scanner;


// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
 public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
//第一步:将输入的两个字符串str1和str2进行前后合并。
        String str1 = sc.next();
        String str2 = sc.next();
        char[]  chars = (str1+str2).toCharArray();
       /* System.out.println(chars);*/
//第二步:对合并后的字符串进行排序,
        //偶数组:
        char[] evenNum = new char[chars.length];
        //奇数组:
        char[] oddNum = new char[chars.length];
        for (int i = 0; i < chars.length; i++) {
            if(i%2==0){//偶数下标
                evenNum[i]=chars[i];
            }else {//奇数下标
                oddNum[i]=chars[i];
            }
        }
        Arrays.sort(evenNum);
        Arrays.sort(oddNum);
        //因为长度较大,所以会把空值排在前面。变成“空 空 空...数值 数值 数值”
        /*System.out.println(evenNum);System.out.println(oddNum);*/
        //排除空值(注意不是空格,需要用'\u0000'表示空值。char类型没有设置值时的默认值'\u0000'),找到第一个是数值的位置。
        int non_null_evenNum = 0;
        int non_null_oddNum = 0;
        for (int i = 0; i < evenNum.length; i++) {
            if (evenNum[i]!='\u0000'){
                non_null_evenNum = i;
                break;
            }
        }
        for (int i = 0; i < oddNum.length; i++) {
            if (oddNum[i]!='\u0000'){
                non_null_oddNum = i;
                break;
            }
        }
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < chars.length; i++) {
            if(i%2==0){//偶数下标
                stringBuffer.append(evenNum[non_null_evenNum]);
                non_null_evenNum++;
            }else {//奇数下标
                stringBuffer.append(oddNum[non_null_oddNum]);
                non_null_oddNum++;
            }
        }
        /*System.out.println(chars);*/
//第三步:对排序后的字符串中的'0'~'9'、'A'~'F'和'a'~'f'字符,需要进行转换操作。
        for (int i = 0; i < chars.length; i++) {
            String str = stringBuffer.substring(i,i+1);
            if(str.matches("[0-9a-fA-F]")){
			   /*Integer.toBinaryString(Integer.parseInt(str,16)
                * 16进制恢复成10进制,然后转换成2进制。*/
                StringBuffer binary = new StringBuffer(Integer.toBinaryString(Integer.parseInt(str,16)));
                int len = binary.length();
                for (int j = 0; j < 4-len; j++) {//补零(不是89abcdef的数不够4位,需要补零。然后才能翻转。)
                    binary.insert(0,"0");
                }
                binary = binary.reverse();//翻转。
                int n = Integer.parseInt(binary.toString(),2);//把二进制转换成十进制
                String hexString = Integer.toHexString(n).toUpperCase();//转换成16进制字符串大写
                stringBuffer.replace(i,i+1,hexString);//替换。在原位置进行替换。
            }
        }
        System.out.println(stringBuffer);
    }
}

https://www.coder.work/article/5500735