剑指offer---3
1.反转单链表,输入链表的头节点,输出该链表,并输出反转后的头节点
这个题目不用再说了,写过N边了
// lowbit表示的是某个数从右往左扫描第一次出现1的位置int lowbit(int x){return x&~(x-1);}void find(int* a , int n){int i , xors;xors = 0;for(i = 0 ; i < n ; ++i)xors ^= a[i];// 三个数两两的异或后lowbit有两个相同,一个不同,可以分为两组int fips = 0;for(i = 0 ; i < n ; ++i)fips ^= lowbit(xors ^ a[i]);//这一步是个关键// 表示的是:flips=lowbit(a^b)^lowbit(a^c)^lowbit(b^c) int b; // 假设三个只出现一次的其中一个数为bb = 0;for(i = 0 ; i < n ; ++i){if(lowbit(xors ^ a[i]) == fips)b ^= a[i];}// 成功找到三个数中一个数cout<<b<<endl;}