BigNumberMultiplication

Problem description

Given two numbers represented as digits per entry in array, return an integer as their product.

public List<Integer> BigNumberMultiplication(int[] num1, int[] num2) {
    /*  
     * Time complexity O(nm)        
     */

    // if both numbers are negative, their product would be positive
    boolean isNegative = (num1[0] < 0 && num2[0] >= 0) || (num1[0] >= 0 && num2[0] < 0);

    num1[0] = Math.abs(num1[0]);
    num2[0] = Math.abs(num2[0]);
    List<Integer> result = new ArrayList<Integer>(num1.length + num2.length);

    for (int i = 0; i < num1.length + num2.length; ++i) {
        result.add(0);
    }

    for (int i = num1.length - 1; i >= 0; i--) {
        for (int j = num2.length - 1; j >= 0; j--) {
            result.set(i + j, result.get(i + j) + num1[i] * num2[j]);
            result.set(i + j + 1, result.get(i + j + 1) + result.get(i + j) / 10);
            result.set(i + j, result.get(i + j) % 10);
        }
    }

    // Skips the leading 0s and keeps one 0 if all are 0s.
    while (result.size() != 1 && result.get(result.size() - 1) == 0) {
        result.remove(result.size() - 1);
    }
    Collections.reverse(result);
    if (isNegative) {
        result.set(0, result.get(0) * -1);
    }
    return result;
}

String multiply

public String multiply(String num1, String num2) {
    if (num1 == null || num2 == null || num1.length() == 0 || num2.length() == 0)
        return null;

    char[] num1Array = new StringBuilder(num1).reverse().toString().toCharArray();
    char[] num2Array = new StringBuilder(num2).reverse().toString().toCharArray();

    List<Integer> result = new ArrayList<Integer>(num1.length() + num2.length());

    for (int i = 0; i < num1.length() + num2.length(); ++i) {
        result.add(0);
    }

    for (int i = 0; i < num1Array.length; i++) {
        for (int j = 0; j < num2Array.length;j++) {
            int product = (num1Array[i] - '0') * (num2Array[j] - '0');
            result.set(i + j, result.get(i + j) + product);
            result.set(i + j + 1, result.get(i + j + 1) + result.get(i + j) / 10);
            result.set(i + j, result.get(i + j) % 10);
        }
    }

    // Skips the leading 0s and keeps one 0 if all are 0s.
    while (result.size() != 1 && result.get(result.size() - 1) == 0) {
        result.remove(result.size() - 1);
    }

    Collections.reverse(result);
    StringBuilder sb = new StringBuilder(result.size());
    for (int i : result)
        sb.append(i);
    return sb.toString();
}