<p>You are given two integer arrays <code>nums1</code> and <code>nums2</code> of lengths <code>m</code> and <code>n</code> respectively. <code>nums1</code> and <code>nums2</code> represent the digits of two numbers. You are also given an integer <code>k</code>.</p>

<p>Create the maximum number of length <code>k &lt;= m + n</code> from digits of the two numbers. The relative order of the digits from the same array must be preserved.</p>

<p>Return an array of the <code>k</code> digits representing the answer.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums1 = [3,4,6,5], nums2 = [9,1,2,5,8,3], k = 5
<strong>Output:</strong> [9,8,6,5,3]
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums1 = [6,7], nums2 = [6,0,4], k = 5
<strong>Output:</strong> [6,7,6,0,4]
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> nums1 = [3,9], nums2 = [8,9], k = 3
<strong>Output:</strong> [9,8,9]
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>m == nums1.length</code></li>
	<li><code>n == nums2.length</code></li>
	<li><code>1 &lt;= m, n &lt;= 500</code></li>
	<li><code>0 &lt;= nums1[i], nums2[i] &lt;= 9</code></li>
	<li><code>1 &lt;= k &lt;= m + n</code></li>
</ul>

class Solution:
    def maxNumber(self, nums1: List[int], nums2: List[int], k: int) -> List[int]:
        nums1 = list(enumerate(nums1))
        nums2 = list(enumerate(nums2))

        def get_max_num(nums, t):
            stack = []
            for i, x in nums:
                min_length = max(0, t - len(nums) + i) 
                while stack and stack[-1] < x and len(stack) > min_length:
                    stack.pop()
                stack.append(x)
            return stack[:t]
                    
        def combine(arr1, arr2):
            i = j = 0
            p, q = len(arr1), len(arr2)
            res = []
            while i < p or j < q:
                if i == p:
                    res.extend(arr2[j:])
                    break
                elif j == q:
                    res.extend(arr1[i:])
                    break
                elif arr1[i] > arr2[j]:
                    res.append(arr1[i])
                    i += 1
                elif arr1[i] < arr2[j]:
                    res.append(arr2[j])
                    j += 1
                elif arr1[i:] > arr2[j:]:
                    res.append(arr1[i])
                    i += 1
                else:
                    res.append(arr2[j])
                    j += 1

            return res

        
        ans = []
        for i in range(k+1):
            if i > len(nums1) or k-i > len(nums2):
                continue

            m1 = get_max_num(nums1, i) if i > 0 else []
            m2 = get_max_num(nums2, k-i) if k-i > 0 else []
            ans.append(combine(m1, m2))
        
        return sorted(ans)[-1]

         
         
18900