和旋转矩阵一样这个题同样是模拟实现题就是你脑子里咋想的用代码还原出来就行。连直觉都不用靠过程就是图中画的那样螺旋着走。先给代码看看大致吧class Solution { public ListInteger spiralOrder(int[][] matrix) { int sizematrix.length*matrix[0].length; ListInteger list new ArrayListInteger(); //初始化 int top1; int bottommatrix.length-1; int left0; int rightmatrix[0].length-1; //初始化 int x0; int y-1; //因为下面的循环里y要先,所以y从-1开始 int count0; while(true){ //先走再判断 y; //往右 while(yright) { list.add(matrix[x][y]);count; y; } if(countsize) break; y--;//走出去了一步处理一下 right--;//右边界收缩 PS不用怕边界收缩成负数, 负数了也无所谓有count控制在合适的时机就退出了 x;//先走一步 //往下 while(xbottom){list.add(matrix[x][y]);count; x;} if(countsize) break; x--;//走出去了一步处理一下 bottom--;//下边界收缩 y--; //往左 while(yleft){list.add(matrix[x][y]);count;y--;} if(countsize) break; y;//走出去了一步处理一下 left; //左边界收缩 x--; //往上走 while(xtop){list.add(matrix[x][y]);count;x--;} if(countsize) break; x; ////走出去了一步处理一下 top; //上边界收缩 } return list; } }其实就是脑海里演练整个过程一开始先往右走。往右走就是x不变y一直加加加到啥时候停下呢到达右边界的时候然后往下走往下走就是y不变x一直加加加到啥时候停下呢到达下边界的时候然后往左走往左走就是x不变y一直减减啥时候停下呢到达左边界的时候。然后往上走往上走就是y不变x一直减减啥时候停下呢到达上边界的时候。然后又开始往右走这是一个循环。这么一通分析你就明白了难点主要是两点难点1一是4个边界的维护难点2二是退出循环的条件难点1边界处理最难受了。首先四个边界是取不溢出的最大下标还是取刚好溢出的下标呢比如说我一行有4个数右边界是y3还是y4呢取前者的话用去判断边界取后者的话用去判断直觉更方便所以这里用不溢出的最大下标。再其次还要考虑4个角上的值属于前一趟走的还是下一趟我让他属于上一趟直觉属于上一趟更方便。难点2退出循环的条件。与其乱七八糟的弄边界的判断比如right或者left到达边界并且topleft的时候 OR top或者bottom到达边界我不确定对不对哈不如直接弄个count计数天才