Java Solution With Comments (Inspired by @dietpepsi)
It's almost the same with the solution by @dietpepsi. I changed some code and added comments to make it easier to understand.\n\n\npublic class Solution {\n    
It's almost the same with the solution by @dietpepsi. I changed some code and added comments to make it easier to understand.\n\n```\npublic class Solution {\n    public int[] maxNumber(int[] nums1, int[] nums2, int k) {\n        int[] maxNum = new int[k];\n        for (int i = 0; i <= k; i++) {\n            if (nums1.length >= i && nums2.length >= k-i) {\n                int[] merged = maxMerge(maxNumberSingleArray(nums1, i), maxNumberSingleArray(nums2, k-i));\n                if (isGreater(merged, 0, maxNum, 0)) {\n                    maxNum = merged;\n                }\n            }\n        }\n        return maxNum;\n    }\n    \n    // compute max number of a single array, given available numbers 'nums[]'' and length 'len'\n    // assume len <= nums.length\n    private int[] maxNumberSingleArray(int[] nums, int len) {\n        int[] result = new int[len];\n        int filledDigits = 0;   // number of digits already filled\n        for (int i = 0; i < nums.length; i++) {\n            int j = filledDigits; // default position for current digit = index of last filled digit\n            while (j > 0 && result[j-1] < nums[i] && nums.length-i >= len-(j-1)) {\n                // want to place larger numbers to as high digit as possible\n                j--;\n            }\n            if (j < len) {\n                result[j] = nums[i];\n                filledDigits = j+1;\n            }\n        }\n        return result;\n    }\n    \n    // merge two number arrays to create a maximum number array\n    // want to use digits from the array with the higher lexicographical order\n    private int[] maxMerge(int[] arr1, int[] arr2) {\n        int len = arr1.length + arr2.length;\n        int[] result = new int[len];\n        int i = 0, j = 0, k = 0;\n        while (k < len) {\n            result[k++] = isGreater(arr1, i, arr2, j) ? arr1[i++] : arr2[j++];\n        }\n        return result;\n    }\n    \n    // compare which array contains a larger number, returns < 0 if arr1 < arr2, == 0 if equal, > 0 if arr1 > arr2\n    private boolean isGreater(int[] arr1, int i, int[] arr2, int j) {\n        while (i < arr1.length && j < arr2.length && arr1[i] == arr2[j]) {\n            i++;\n            j++;\n        }\n        // arr1 is lexicographically greater if it has a longer length, or  has a digit greater than the digit as same place in arr2\n        return i < arr1.length && j == arr2.length || (i < arr1.length && j < arr2.length && arr1[i] > arr2[j]);\n    }\n}\n```
[]