Medium

Spiral Matrix IVC++

Full explanation · Time O(m * n) · Space O(1)

// Time:  O(m * n)
// Space: O(1)

// linked list, array
class Solution {
public:
    vector<vector<int>> spiralMatrix(int m, int n, ListNode* head) {
        static const vector<pair<int, int>> directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        vector<vector<int>> result(m, vector<int>(n, -1));
        for (int i = 0, j = 0, d = 0; head; head = head->next) {
            result[i][j] = head->val;
            if (!(0 <= i + directions[d].first && i + directions[d].first < m &&
                  0 <= j + directions[d].second && j + directions[d].second < n &&
                  result[i + directions[d].first][j + directions[d].second] == -1)) {
                d = (d + 1) % 4;
            }
            i += directions[d].first;
            j += directions[d].second;
        }
        return result;
    }
};