Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Move from brute-force thinking to an efficient approach using array strategy.
You are given two integers m and n, which represent the dimensions of a matrix.
You are also given the head of a linked list of integers.
Generate an m x n matrix that contains the integers in the linked list presented in spiral order (clockwise), starting from the top-left of the matrix. If there are remaining empty spaces, fill them with -1.
Return the generated matrix.
Example 1:
Input: m = 3, n = 5, head = [3,0,2,6,8,1,7,9,4,2,5,5,0] Output: [[3,0,2,6,8],[5,0,-1,-1,1],[5,2,4,9,7]] Explanation: The diagram above shows how the values are printed in the matrix. Note that the remaining spaces in the matrix are filled with -1.
Example 2:
Input: m = 1, n = 4, head = [0,1,2] Output: [[0,1,2,-1]] Explanation: The diagram above shows how the values are printed from left to right in the matrix. The last space in the matrix is set to -1.
Constraints:
1 <= m, n <= 1051 <= m * n <= 105[1, m * n].0 <= Node.val <= 1000Problem summary: You are given two integers m and n, which represent the dimensions of a matrix. You are also given the head of a linked list of integers. Generate an m x n matrix that contains the integers in the linked list presented in spiral order (clockwise), starting from the top-left of the matrix. If there are remaining empty spaces, fill them with -1. Return the generated matrix.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array · Linked List
3 5 [3,0,2,6,8,1,7,9,4,2,5,5,0]
1 4 [0,1,2]
spiral-matrix)spiral-matrix-ii)spiral-matrix-iii)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #2326: Spiral Matrix IV
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public int[][] spiralMatrix(int m, int n, ListNode head) {
int[][] ans = new int[m][n];
for (var row : ans) {
Arrays.fill(row, -1);
}
int i = 0, j = 0, k = 0;
final int[] dirs = {0, 1, 0, -1, 0};
while (true) {
ans[i][j] = head.val;
head = head.next;
if (head == null) {
break;
}
while (true) {
int x = i + dirs[k], y = j + dirs[k + 1];
if (x >= 0 && x < m && y >= 0 && y < n && ans[x][y] == -1) {
i = x;
j = y;
break;
}
k = (k + 1) % 4;
}
}
return ans;
}
}
// Accepted solution for LeetCode #2326: Spiral Matrix IV
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func spiralMatrix(m int, n int, head *ListNode) [][]int {
ans := make([][]int, m)
for i := range ans {
ans[i] = make([]int, n)
for j := range ans[i] {
ans[i][j] = -1
}
}
i, j, k := 0, 0, 0
dirs := [5]int{0, 1, 0, -1, 0}
for {
ans[i][j] = head.Val
if head = head.Next; head == nil {
break
}
for {
x, y := i+dirs[k], j+dirs[k+1]
if x >= 0 && x < m && y >= 0 && y < n && ans[x][y] == -1 {
i, j = x, y
break
}
k = (k + 1) % 4
}
}
return ans
}
# Accepted solution for LeetCode #2326: Spiral Matrix IV
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def spiralMatrix(self, m: int, n: int, head: Optional[ListNode]) -> List[List[int]]:
ans = [[-1] * n for _ in range(m)]
i = j = k = 0
dirs = (0, 1, 0, -1, 0)
while 1:
ans[i][j] = head.val
head = head.next
if head is None:
break
while 1:
x, y = i + dirs[k], j + dirs[k + 1]
if 0 <= x < m and 0 <= y < n and ans[x][y] == -1:
i, j = x, y
break
k = (k + 1) % 4
return ans
// Accepted solution for LeetCode #2326: Spiral Matrix IV
/**
* [2326] Spiral Matrix IV
*
* You are given two integers m and n, which represent the dimensions of a matrix.
* You are also given the head of a linked list of integers.
* Generate an m x n matrix that contains the integers in the linked list presented in spiral order (clockwise), starting from the top-left of the matrix. If there are remaining empty spaces, fill them with -1.
* Return the generated matrix.
*
* Example 1:
* <img alt="" src="https://assets.leetcode.com/uploads/2022/05/09/ex1new.jpg" style="width: 240px; height: 150px;" />
* Input: m = 3, n = 5, head = [3,0,2,6,8,1,7,9,4,2,5,5,0]
* Output: [[3,0,2,6,8],[5,0,-1,-1,1],[5,2,4,9,7]]
* Explanation: The diagram above shows how the values are printed in the matrix.
* Note that the remaining spaces in the matrix are filled with -1.
*
* Example 2:
* <img alt="" src="https://assets.leetcode.com/uploads/2022/05/11/ex2.jpg" style="width: 221px; height: 60px;" />
* Input: m = 1, n = 4, head = [0,1,2]
* Output: [[0,1,2,-1]]
* Explanation: The diagram above shows how the values are printed from left to right in the matrix.
* The last space in the matrix is set to -1.
*
* Constraints:
*
* 1 <= m, n <= 10^5
* 1 <= m * n <= 10^5
* The number of nodes in the list is in the range [1, m * n].
* 0 <= Node.val <= 1000
*
*/
pub struct Solution {}
use crate::util::linked_list::{ListNode, to_list};
// problem: https://leetcode.com/problems/spiral-matrix-iv/
// discuss: https://leetcode.com/problems/spiral-matrix-iv/discuss/?currentPage=1&orderBy=most_votes&query=
// submission codes start here
// Definition for singly-linked list.
// #[derive(PartialEq, Eq, Clone, Debug)]
// pub struct ListNode {
// pub val: i32,
// pub next: Option<Box<ListNode>>
// }
//
// impl ListNode {
// #[inline]
// fn new(val: i32) -> Self {
// ListNode {
// next: None,
// val
// }
// }
// }
impl Solution {
pub fn spiral_matrix(m: i32, n: i32, head: Option<Box<ListNode>>) -> Vec<Vec<i32>> {
vec![]
}
}
// submission codes end
#[cfg(test)]
mod tests {
use super::*;
#[test]
#[ignore]
fn test_2326_example_1() {
let m = 3;
let n = 5;
let head = linked![3, 0, 2, 6, 8, 1, 7, 9, 4, 2, 5, 5, 0];
let result = vec![
vec![3, 0, 2, 6, 8],
vec![5, 0, -1, -1, 1],
vec![5, 2, 4, 9, 7],
];
assert_eq!(Solution::spiral_matrix(m, n, head), result);
}
#[test]
#[ignore]
fn test_2326_example_2() {
let m = 1;
let n = 4;
let head = linked![0, 1, 2];
let result = vec![vec![0, 1, 2, -1]];
assert_eq!(Solution::spiral_matrix(m, n, head), result);
}
}
// Accepted solution for LeetCode #2326: Spiral Matrix IV
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function spiralMatrix(m: number, n: number, head: ListNode | null): number[][] {
const ans: number[][] = Array.from({ length: m }, () => Array(n).fill(-1));
const dirs: number[] = [0, 1, 0, -1, 0];
let [i, j, k] = [0, 0, 0];
while (1) {
ans[i][j] = head.val;
head = head.next;
if (!head) {
break;
}
while (1) {
const [x, y] = [i + dirs[k], j + dirs[k + 1]];
if (x >= 0 && x < m && y >= 0 && y < n && ans[x][y] === -1) {
i = x;
j = y;
break;
}
k = (k + 1) % 4;
}
}
return ans;
}
Use this to step through a reusable interview workflow for this problem.
Copy all n nodes into an array (O(n) time and space), then use array indexing for random access. Operations like reversal or middle-finding become trivial with indices, but the O(n) extra space defeats the purpose of using a linked list.
Most linked list operations traverse the list once (O(n)) and re-wire pointers in-place (O(1) extra space). The brute force often copies nodes to an array to enable random access, costing O(n) space. In-place pointer manipulation eliminates that.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Wrong move: Pointer updates overwrite references before they are saved.
Usually fails on: List becomes disconnected mid-operation.
Fix: Store next pointers first and use a dummy head for safer joins.