还记得前两天第一次做这个的时候真是打击了自己,没有什么好办法主要是考虑边界问题,顺着打,避免重复就可以了。


public ArrayList<Integer> spiralOrder(int[][] matrix) {
    ArrayList<Integer> res=new ArrayList<>();
    if(matrix==null || matrix.length==0){
        return res;
    }        
    int m=matrix.length;
    int n=matrix[0].length;
    int x=0;
    int y=0;
    int tmp=0; //记录圈数,用来定位每一圈的上下左右的边界
    while(res.size()<m*n){ //控制退出
        while(y<n-tmp && res.size()<m*n){ //边界控制,同时在过程中有可能打印结束 
            res.add(matrix[x][y]);
            y++;
        }
        y--;//最后一个y是超标了的要吐出来,
        x+=1;//把位置下移一个,到这里的 x,y组成新的坐标作为下一轮的起点,防止重复加入上一轮的最后一个元素
        while(x<m-tmp && res.size()<m*n ){
            res.add(matrix[x][y]);
            x++;
        }
        x--;
        y-=1;
        while(y>=0+tmp && res.size()<m*n){
            res.add(matrix[x][y]);
            y--;
        }
        y++;
        x-=1;
        while(x>=1+tmp && res.size()<m*n){//注意这里的 x条件
            res.add(matrix[x][y]);
            x--;
        }
        x++;//归位到本来的位置
        tmp++;//一圈打完了就再来一圈
        y++;//下移
    }
    return res;
}