O(k(m+n)). Python Solution with monotonically decreasing stack. Commented for clarity.
This solution is pretty efficient and intuitive.\nTime complexity is O(k(n+m)) where n and m is length of each list. \n\n\nTo understand this solution you must 
This solution is pretty efficient and intuitive.\nTime complexity is **O(k(n+m))** where n and m is length of each list. \n\n\nTo understand this solution you must also do other problems concerning monotonic stack like LC-402 which are pre-requisites for this problem.\n\nDo give me a thumbs up if u like it.\n```\nclass Solution:\n    def maxNumber(self, nums1: List[int], nums2: List[int], k: int) -> List[int]:\n        def maximum_num_each_list(nums: List[int], k_i: int) -> List[int]:\n            # monotonically decreasing stack\n            s = []\n            m = len(nums) - k_i\n            for n in nums:\n                while s and s[-1] < n and m > 0:\n                    s.pop()\n                    m -= 1\n                s.append(n)\n            s = s[:len(s)-m] # very important\n            return s\n        def greater(a, b, i , j): # get the number which is lexiographically greater\n            while i< len(a) or j < len(b): \n                if i == len(a): return False\n                if j == len(b): return True\n                if a[i] > b[j]: return True\n                if a[i] < b[j]: return False\n                i += 1 # we increment until each of their elements are same\n                j += 1\n        \n        def merge(x_num, y_num):\n            n = len(x_num)\n            m = len(y_num)\n            i = 0\n            j = 0\n            s = []\n            while i < n or j < m:\n                a = x_num[i] if i < n else float("-inf") \n                b = y_num[j] if j < m else float("-inf") \n\n                if a > b or greater(x_num, y_num, i , j):\n# greater(x_num, y_num, i , j): this function is meant for check which list has element lexicographically greater means it will iterate through both arrays incrementing both at the same time until one of them is greater than other.\n                    chosen = a\n                    i += 1\n                else:\n                    chosen = b\n                    j += 1\n                s.append(chosen)\n            return s\n\n        max_num_arr = []\n        for i in range(k+1): # we check for all values of k and find the maximum number we can create for that value of k and we repeat this for all values of k and then at eacch time merge the numbers to check if arrive at optimal solution\n            first = maximum_num_each_list(nums1, i)\n            second = maximum_num_each_list(nums2, k-i)\n            merged = merge(first, second)\n            # these two conditions are required because list comparison in python only compares the elements even if one of their lengths is greater, so I had to add these conditions to compare elements only if length is equal.\n\t\t\t# Alternatively you can avoid this and convert them both to int and then compare, but I wanted to this as  it is somewhat more efficient.\n            if len(merged) == len(max_num_arr) and  merged > max_num_arr:\n                max_num_arr = merged\n            elif len(merged) > len(max_num_arr):\n                max_num_arr = merged\n        return max_num_arr\n\n```\nFeel free to ask any questions in the comments.\nDo suggest improvements if any.
['Stack', 'Greedy', 'Monotonic Stack', 'Python', 'Python3']