func maxNumber(nums1 []int, nums2 []int, k int) []int {
	m, n := len(nums1), len(nums2)
	max := make([]int, m+n)
	for i := maxInt(0, k-n); i <= minInt(k, m); i++ {
		num := merge(pick(nums1, i), pick(nums2, k-i))
		if less(max, num) {
			max = num
		}
	}
	return max
}

func less(nums1, nums2 []int) bool {
	for i := range nums1 {
		if nums1[i] < nums2[i] {
			return true
		} else if nums2[i] < nums1[i] {
			return false
		}
	}
	return false
}

func pick(nums []int, k int) []int {
	n := len(nums)
	st := make([]int, 0)
loop:
	for i := 0; i < n; i++ {
		for {
			if l := len(st); l+n-i == k {
				st = append(st, nums[i:]...)
				break loop
			} else if 0 < l && st[l-1] < nums[i] {
				st = st[:l-1]
			} else {
				st = append(st, nums[i])
				break
			}
		}
	}
	return st[:k]
}

func merge(nums1, nums2 []int) []int {
	m, n := len(nums1), len(nums2)
	res := make([]int, m+n)
	i, i1, i2 := 0, 0, 0
	for mv1 := false; i1 < m && i2 < n; i++ {
		if nums1[i1] < nums2[i2] {
			mv1 = false
		} else if nums2[i2] < nums1[i1] {
			mv1 = true
		} else {
			for j1, j2, n1, n2 := i1+1, i2+1, 0, 0; (j1 < m || j2 < n) && n1 == n2; j1, j2 = j1+1, j2+1 {
				if m <= j1 {
					n1 = 0
				} else {
					n1 = nums1[j1]
				}
				if n <= j2 {
					n2 = 0
				} else {
					n2 = nums2[j2]
				}
				if n1 < n2 {
					mv1 = false
				} else if n2 < n1 {
					mv1 = true
				}
			}
		}
		if mv1 {
			res[i] = nums1[i1]
			i1++
		} else {
			res[i] = nums2[i2]
			i2++
		}
	}
	if i1 != m {
		copy(res[i:], nums1[i1:])
	}
	if i2 != n {
		copy(res[i:], nums2[i2:])
	}
	return res
}

func maxInt(x, y int) int {
	if x < y {
		return y
	}
	return x
}

func minInt(x, y int) int {
	if x < y {
		return x
	}
	return y
}