牛客网剑指Offer题解C++ (3/10)

版权声明:本文为博主原创文章,转载请注明。 https://blog.csdn.net/mrbacker/article/details/79731764

一、调整整数数组使奇数位于偶数前面

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

算法思想

这题我的想法是遍历数组,遇到偶数就将该偶数后面的前移移位,并将该偶数移到最后面,给一个值标记第一个偶数移的位置,当遍历到第一个偶数就完成了。

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        int size = array.size();
        int i = 0;
        int tmp;
        while(i < size) {
            while(array[i] % 2 == 0) {
                tmp = array[i];
                for(int j = i; j < array.size() - 1; j++) {
                    array[j] = array[j+1];
                }
                array[array.size() - 1] = tmp;
                size--;
                if(i == size)
                    return;
            }
            i++;
        }
    }
};

二、链表中倒数第K个结点。

题目描述

输入一个链表,输出该链表中倒数第k个结点。

算法描述

就是统计总共的节点数,再遍历n - k + 1 次,输出即可

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        int count = 0;
        ListNode* p = pListHead;
        while(p) {
            count++;
            p = p->next;
        }
        if(k > count)
            return NULL;
        p = pListHead;
        for(int i = 1; i + k <= count; i++) {
            p = p->next;
        }
        return p;
    }
}

三、反转链表

题目描述

输入一个链表,反转链表后,输出链表的所有元素

算法描述

这里写图片描述

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(!pHead)
            return NULL;
        ListNode *p = pHead->next;
        if(!p)
            return pHead;
        ListNode *q = p->next;
		pHead->next = NULL;
        while(q && p) {
			p->next = pHead;

			pHead = p;
			p = q;
			q = q->next;
        }
        p->next = pHead;
        return p;
    }
};

四、合并两个排序的链表

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

算法描述

两个链表1结点值小就选链表1结点,否则选链表2结点,当其中一个链表比较完,就将另外一个链表接到合成的链表后。

class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        ListNode *Head;
        ListNode *p = (ListNode*)malloc(sizeof(ListNode));
        p->next = NULL;
        Head = p;
        ListNode *p1 = pHead1;
        ListNode *p2 = pHead2;
        while(p1 && p2) {
            if(p1->val <  p2->val) {
                p->next = p1;
                p1 = p1->next;
                p = p->next;
            }
            else {
                p->next = p2;
                p2 = p2->next;
                p = p->next;
            }
        }
        if(p1)
            p->next = p1;
        if(p2)
            p->next = p2;
        return Head->next;
    }
};

五、树的子结构

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

算法描述

六、二叉树的镜像

题目描述

操作给定的二叉树,将其变换为源二叉树的镜像。

输入描述:

二叉树的镜像定义:源二叉树

    	    8
    	   /  \
    	  6   10
    	 / \  / \
    	5  7 9 11
    	镜像二叉树:
    	    8
    	   /  \
    	  10   6
    	 / \  / \
    	11 9 7  5

###算法描述
遍历二叉树同时交换左右儿子

class Solution {
public:
    void Mirror(TreeNode *pRoot) {
        if(pRoot) {
            TreeNode *p;
            p = pRoot->left;
            pRoot->left = pRoot->right;
            pRoot->right = p;
            Mirror(pRoot->left);
            Mirror(pRoot->right);
        }
    }
};

猜你喜欢

转载自blog.csdn.net/mrbacker/article/details/79731764