```
public List<Integer> grayCode(int n) {
List<Integer> result = new ArrayList<Integer>();
result.add(0);
for(int i=1; i<=n; i++){
int size = result.size()-1;
for(int j=size; j>=0; j--){
result.add(result.get(j) | 1<<i-1);
}
}
return result;
}
```