input: Write a function named `predict_housing_price` that uses Linear Regression to predict housing prices based on the living area and number of rooms. The function should take a list of training data where each element is a list containing the living area (in square feet) and the number of rooms, followed by the corresponding housing prices. It should also take a list containing the living area and number of rooms of a house for which the price needs to be predicted. The function should return the predicted price for the given input.
  assert predict_housing_price([[2000, 3], [1600, 2.5], [2400, 3.5], [1400, 2], [3000, 4]], [75000, 43000, 59000, 32000, 85000], [2200, 3]) == 62377.192982456134
  assert predict_housing_price([[1000, 2], [1500, 3], [2000, 4]], [45000, 67000, 95000], [1800, 3.5]) == 83500.0
  assert predict_housing_price([[2500, 4], [1800, 3], [3200, 5]], [100000, 80000, 120000], [2800, 4.5]) == 110000.0
  assert predict_housing_price([], [], [2200, 3]) == None  # No data provided
output: def predict_housing_price(training_data, prices, input_data):
      if not training_data:
          return None
      
      X = [[1, area, rooms] for area, rooms in training_data]
      y = prices
      
      X_train = np.array(X)
      y_train = np.array(y)
      
      theta = np.linalg.inv(X_train.T.dot(X_train)).dot(X_train.T).dot(y_train)
      
      input_X = [1, input_data[0], input_data[1]]
      predicted_price = np.dot(input_X, theta)
      
      return predicted_price