题目

给你两个整数:mn ,表示矩阵的维数。

另给你一个整数链表的头节点 head

请你生成一个大小为 m x n 的螺旋矩阵,矩阵包含链表中的所有整数。链表中的整数从矩阵 左上角 开始、顺时针 按 螺旋 顺序填充。如果还存在剩余的空格,则用 -1 填充。

返回生成的矩阵。

示例 1:
image.png

  1. 输入:m = 3, n = 5, head = [3,0,2,6,8,1,7,9,4,2,5,5,0]
  2. 输出:[[3,0,2,6,8],[5,0,-1,-1,1],[5,2,4,9,7]]
  3. 解释:上图展示了链表中的整数在矩阵中是如何排布的。
  4. 注意,矩阵中剩下的空格用 -1 填充。

示例 2:
image.png

  1. 输入:m = 1, n = 4, head = [0,1,2]
  2. 输出:[[0,1,2,-1]]
  3. 解释:上图展示了链表中的整数在矩阵中是如何从左到右排布的。
  4. 注意,矩阵中剩下的空格用 -1 填充。

提示:

  • 1 <= m, n <= 10^5
  • 1 <= m * n <= 10^5
  • 链表中节点数目在范围 [1, m * n]
  • 0 <= Node.val <= 1000

    解题方法

    模拟行为

    模拟螺旋填入的行为,遍历链表。注意控制下一次填充矩阵的边界。
    时间复杂度O(n),空间复杂度O(mn)
    C++代码:
    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode() : val(0), next(nullptr) {}
    7. * ListNode(int x) : val(x), next(nullptr) {}
    8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
    9. * };
    10. */
    11. class Solution {
    12. public:
    13. vector<vector<int>> spiralMatrix(int m, int n, ListNode* head) {
    14. vector<vector<int>> result(m, vector<int>(n, -1));
    15. ListNode* cur = head;
    16. int i, j;
    17. int s = 0;
    18. while(cur) {
    19. i = s; j = s;
    20. while(cur && j<n) {
    21. result[i][j] = cur->val;
    22. j++;
    23. cur = cur->next;
    24. }
    25. j--; i++;
    26. while(cur && i<m) {
    27. result[i][j] = cur->val;
    28. i++;
    29. cur = cur->next;
    30. }
    31. i--; j--;
    32. while(cur && j>=s) {
    33. result[i][j] = cur->val;
    34. j--;
    35. cur = cur->next;
    36. }
    37. i--; j++;
    38. while(cur && i>s) {
    39. result[i][j] = cur->val;
    40. i--;
    41. cur = cur->next;
    42. }
    43. m--;
    44. n--;
    45. s++;
    46. }
    47. return result;
    48. }
    49. };