调整数组的位置时奇数放在偶数前
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector <int> a,b;
for(int i=0;i<array.size();i++)
{
if(array[i]%2==1) a.push_back(array[i]);
else b.push_back(array[i]);
}
array.clear();
for(int i=0;i<a.size();i++)
{
array.push_back(a[i]);
}
for(int i=0;i<b.size();i++)
{
array.push_back(b[i]);
}
}
};
链表中倒数第k个结点
- 跑一遍链表有多少个结点,然后输出第n-k+1个结点就是倒数第k个结点
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
unsigned int num=0;
ListNode *p = pListHead;
while(p!=NULL)
{
num++;
p=p->next;
}
p = pListHead;
unsigned int i=0;
while(p!=NULL)
{
if(i+k==num) return p;
i++;
p=p->next;
}
return p;
}
};
反转链表
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode * p = (ListNode*) malloc(sizeof(ListNode));
p->next = NULL;
while(pHead!=NULL)
{
ListNode * k = (ListNode*) malloc(sizeof(ListNode));
k->val = pHead->val;
k->next = p->next;
p->next = k;
pHead = pHead->next;
}
return p->next;
}
};
合并两个排序的链表
- 平时写代码不严谨的锅,没有考虑两个链表可能为空的情况,导致一直提示段溢出,差点怀疑人生,整整搁置数天才AC了,AC的代码写得也很不好,过几天再得重新写一下
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==NULL&&pHead2!=NULL) return pHead2;
else if(pHead1!=NULL&&pHead2==NULL) return pHead1;
else if(pHead1==NULL&&pHead2==NULL) return NULL;
int num;
if(pHead1->val<pHead2->val)
{
num = pHead1->val;
pHead1 = pHead1->next;
}
else
{
num = pHead2->val;
pHead2 = pHead2->next;
}
ListNode * head = new ListNode(num);
ListNode *p = head;
while(pHead1!=NULL&&pHead2!=NULL)
{
if(pHead1->val<pHead2->val)
{
num = pHead1->val;
pHead1 = pHead1->next;
}
else
{
num = pHead2->val;
pHead2 = pHead2->next;
}
ListNode * k = new ListNode(num);
p->next = k;
p = p->next;
}
if(pHead1!=NULL)
{
p->next = pHead1;
}
if(pHead2!=NULL)
{
p->next = pHead2;
}
return head;
}
};
树的子结构
- 利用队列层次遍历所有树结点,再利用递归判断是否为子结构
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool judge(TreeNode* node1,TreeNode* node2)
{
if(node1==NULL&&node2!=NULL) return false;
else if(node1!=NULL&&node2==NULL) return true;
else if(node1==NULL&&node2==NULL) return true;
else
{
if(node1->val!=node2->val) return false;
else
return judge(node1->left,node2->left)&&judge(node1->right,node2->right);
}
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1==NULL) return false;
if(pRoot2==NULL) return false;
queue <TreeNode*> q;
q.push(pRoot1);
while(!q.empty())
{
TreeNode * k = q.front();
q.pop();
if(judge(k,pRoot2)==true) return true;
if(k->left!=NULL) q.push(k->left);
if(k->right!=NULL) q.push(k->right);
}
return false;
}
};
二叉树的镜像
- 利用自上而下调用递归,先将当前结点的两个子树交换,在分别对这两个子树的左右子树进行交换
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(pRoot!=NULL)
{
TreeNode * l = pRoot->left;
TreeNode * r = pRoot->right;
pRoot->left = r;
pRoot->right = l;
Mirror(l);
Mirror(r);
}
}
};