Description,
Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and num2.

Note:

The length of both num1 and num2 is < 5100.
Both num1 and num2 contains only digits 0-9.
Both num1 and num2 does not contain any leading zero.
You must not use any built-in BigInteger library or convert the inputs to integer directly.

Strait-forward solution in Python

class Solution(object):
    def addStrings(self, num1, num2):
        """
        @runtime: 59ms
        """
        num1 = list(num1)
        num2 = list(num2)
        ret = []
        carry = 0
        while num1 and num2:
            a = ord(num1.pop()) - ord('0')
            b = ord(num2.pop()) - ord('0')
            c = (a+b+carry)%10
            carry = (a+b+carry)/10
            ret.append(c)
        while num1:
            if carry:
                a = ord(num1.pop()) - ord('0')
                c = (a+carry)%10
                carry  = (a+carry)/10
                ret.append(c)
            else:
                ret.append(num1.pop())
        while num2:
            if carry:
                b = ord(num2.pop()) - ord('0')
                c = (b+carry)%10
                carry  = (b+carry)/10
                ret.append(c)
            else:
                ret.append(num2.pop())
        if carry:
            ret.append(carry)
        ret.reverse()
        return ''.join(map(str, ret))
            
        

imgRuntime: 59ms

Concise solution in Java

public class Solution {
    public String addStrings(String num1, String num2) {
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        for (int i=num1.length()-1, j=num2.length()-1; i>=0 || j>=0 || carry!=0; i--, j--) {
            int I = i<0 ? 0 : num1.charAt(i)-'0';
            int J = j<0 ? 0 : num2.charAt(j)-'0';
            sb.append((I+J+carry)%10);
            carry = (I+J+carry)/10;
        }
        return sb.reverse().toString();
    }
}

imgRuntime: 24ms