文章目录
两个链表的第一个公共结点
题目描述
- 输入两个链表,找出它们的第一个公共结点。
C++代码
//用栈解决这个问题,将链表压入栈,再分别将节点弹出来,若碰到两个栈节点不一致则说明上一个弹出的节点是第一个公共点。(该方法采用了逆向思维,将链表从后往前处理)
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(pHead1==NULL || pHead2==NULL)
{
return NULL;
}
else
{
stack<ListNode*>first;
stack<ListNode*>second;
ListNode*ptemp1 = pHead1;
while(ptemp1!=NULL)
{
first.push(ptemp1);
ptemp1= ptemp1->next;
}
ListNode*ptemp2 = pHead2;
while(ptemp2!=NULL)
{
second.push(ptemp2);
ptemp2= ptemp2->next;
}
ListNode *node1 = NULL;
ListNode *node2 = NULL;
ListNode *common = NULL;
while(first.size()>0 && second.size()>0)
{
node1 = first.top();
node2 = second.top();
if (node1->val == node2->val)
{
common = node1;
first.pop();
second.pop();
}
else
{
break;
}
}
return common;
}
}
};
数字在排序数组中出现的次数
题目描述
- 统计一个数字在排序数组中出现的次数。
C++代码
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k)
{
//第一种方法
//return count(data.begin(),data.end(),k);
//第二种方法
int num = data.size();
int index1 = -1;
int index2 = -1;
for(int i = 0;i<num;i++)
{
if(data[i]==k)
{
index1 = i;
break;
}
}
if(index1==-1)
{
return 0;
}
else
{
for(int i = index1;i<num;i++)
{
if(data[i]==k)
{
index2 = i;
}
else
{
break;
}
}
return index2-index1+1;
}
}
};
二叉树的深度
题目描述
- 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
C++代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
int TreeDepth(TreeNode* pRoot)
{
int dl,dr,d;
if(pRoot==NULL)
{
d = 0;
}
else
{
dl = TreeDepth(pRoot->left);
dr = TreeDepth(pRoot->right);
d = 1 +(dl>dr?dl:dr);
}
return d;
}
};
平衡二叉树
题目描述
- 输入一棵二叉树,判断该二叉树是否是平衡二叉树。
C++代码
class Solution {
public:
int TreeDepth(TreeNode *pRoot)
{
if(pRoot==NULL)
{
return 0;
}
if(pRoot->left==NULL && pRoot->right==NULL)
{
return 1;
}
int left = TreeDepth(pRoot->left)+1;
int right = TreeDepth(pRoot->right)+1;
return left>right?left:right;
}
bool IsBalanced_Solution(TreeNode* pRoot)
{
if(pRoot==NULL)
{
return true;
}
int left = TreeDepth(pRoot->left);
int right = TreeDepth(pRoot->right);
int diff = left-right;
if(diff>1 || diff<-1)
{
return false;
}
return IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right);
}
};
数组中只出现一次的数字
题目描述
- 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
C++代码
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2)
{
unordered_map<int,int>mp;
vector<int>result;
for(int i = 0;i<data.size();i++)
{
mp[data[i]]++;
}
for(int j = 0;j<data.size();j++)
{
if(mp[data[j]]==1)
{
result.push_back(data[j]);
}
}
*num1 = result[0];
*num2 = result[1];
}
};