class Solution {
public int[] twoSum(int[] nums, int target) {
final int il = nums.length;
int il2 = (il >> 2) - 1;
int pot = 2;
while((il2 >>= 1) > 0) pot <<= 1;
final int bitMod = pot - 1;
final int[] bucket = new int[pot];
final int[] linked = new int[il];
final int firstVal = nums[0];
for (int i = 1; i < il; i++) {
int currNum = nums[i];
int complement = target - currNum;
if (complement == firstVal) {
return new int[] { 0, i };
}
int complementLLIndex = bucket[complement & bitMod];
while(complementLLIndex != 0) {
if(nums[complementLLIndex] == complement) {
//Found
return new int[] { complementLLIndex, i };
}
complementLLIndex = linked[complementLLIndex];
}
int currNumLLIndex = currNum & bitMod;
linked[i] = bucket[currNumLLIndex];
bucket[currNumLLIndex] = i;
}
return null;
}
}