JavaScript (ES6), 51 49 bytes

NB: This answer was posted before the loose I/O formats were explicitly allowed. With zero-padded arrays of digits, this can be done in 33 bytes, (but is much less interesting, IMHO).

Takes input as two integers. Returns an integer.

f=(a,b,t=10)=>a|b&&(a%t<b%t?b:a)%t+t*f(a/t,b/t)|0


Try it online!

Commented

f = (                     // f = recursive function taking:
a,                      //   a = first integer
b,                      //   b = second integer
t = 10                  //   t = 10 (which is used 6 times below)
) =>                      //
a | b                   // bitwise OR between a and b to test whether at least one of
// them still has an integer part
&&                      // if not, stop recursion; otherwise:
(                       //
a % t < b % t ? b : a // if a % 10 is less than b % 10: use b; otherwise: use a
) % t +                 // isolate the last decimal digit of the selected number
t *                     // add 10 times the result of
f(a / t, b / t)         // a recursive call with a / 10 and b / 10
| 0                     // bitwise OR with 0 to isolate the integer part


Alternate version

or:Same I/O format.

f=(a,b)=>a|b&&[f(a/10,b/10)]+(a%10<b%10?b:a)%10|0


Try it online!

JavaScript (ES6), 51 49 bytes

f=(a,b,t=10)=>a|b&&(a%t<b%t?b:a)%t+t*f(a/t,b/t)|0


Try it online!

or:

f=(a,b)=>a|b&&[f(a/10,b/10)]+(a%10<b%10?b:a)%10|0


Try it online!

JavaScript (ES6), 51 49 bytes

NB: This answer was posted before the loose I/O formats were explicitly allowed. With zero-padded arrays of digits, this can be done in 33 bytes, (but is much less interesting, IMHO).

Takes input as two integers. Returns an integer.

f=(a,b,t=10)=>a|b&&(a%t<b%t?b:a)%t+t*f(a/t,b/t)|0


Try it online!

Commented

f = (                     // f = recursive function taking:
a,                      //   a = first integer
b,                      //   b = second integer
t = 10                  //   t = 10 (which is used 6 times below)
) =>                      //
a | b                   // bitwise OR between a and b to test whether at least one of
// them still has an integer part
&&                      // if not, stop recursion; otherwise:
(                       //
a % t < b % t ? b : a // if a % 10 is less than b % 10: use b; otherwise: use a
) % t +                 // isolate the last decimal digit of the selected number
t *                     // add 10 times the result of
f(a / t, b / t)         // a recursive call with a / 10 and b / 10
| 0                     // bitwise OR with 0 to isolate the integer part


Alternate version

Same I/O format.

f=(a,b)=>a|b&&[f(a/10,b/10)]+(a%10<b%10?b:a)%10|0


Try it online!

JavaScript (ES6), 51 49 bytes

f=(a,b,t=10)=>a|b&&(a%t<b%t?b:a)%t+t*f(a/t,b/t)|0


Try it online!

or:

f=(a,b)=>a|b&&[f(a/10,b/10)]+(a%10<b%10?b:a)%10|0


Try it online!

JavaScript (ES6), 51 49 bytes

f=(a,b,t=10)=>a|b&&(a%t<b%t?b:a)%t+t*f(a/t,b/t)|0


Try it online!

JavaScript (ES6), 51 49 bytes

f=(a,b,t=10)=>a|b&&(a%t<b%t?b:a)%t+t*f(a/t,b/t)|0


Try it online!

or:

f=(a,b)=>a|b&&[f(a/10,b/10)]+(a%10<b%10?b:a)%10|0


Try it online!

2 saved 2 bytes

JavaScript (ES6), 5151 49 bytes

f=(a,b,t=10)=>a|b&&~~Math.max=>a|b&&(a%10,b%10a%t<b%t?b:a)+10*f%t+t*f(a/10t,b/10t)|0


JavaScript (ES6), 51 bytes

f=(a,b)=>a|b&&~~Math.max(a%10,b%10)+10*f(a/10,b/10)


Try it online!

JavaScript (ES6), 51 49 bytes

f=(a,b,t=10)=>a|b&&(a%t<b%t?b:a)%t+t*f(a/t,b/t)|0


Try it online!

1