笔试算法题(27):判断单向链表是否有环并找出环入口节点 & 判断两棵二元树是否相等
出题:判断一个单向链表是否有环,如果有环则找到环入口节点;
分析:
- 第一个问题:使用快慢指针(fast指针一次走两步,slow指针一次走一步,并判断是否到达NULL,如果fast==slow成立,则说明链表有环);
- 第二个问题:fast与slow相遇时,slow一定还没有走完一圈(反证法可证明);

示意图 A为起始点,B为环入口点,C为相遇点,则a1=|AB|表示起始点到换入口的距离,a2=|CB|表示相遇点到环入口点的距离,s1=|AB|+|BC|表示slow指针走的长度,s2表示fast指针走的长度,C=|BCB|表示环的长度
由于fast的速度是slow的2倍,所以相遇的时候走过的长度也是2倍
s2=2*s1=a1+N*C+(s1-a1) (1)
N表示fast在环中走的圈数,化解(1)得到:
s1=N*C (2)
找到a1和a2的关系:
a2=C-(s1-a1) (3)
将(2)代入(3)得到:
a1=a2+(N-1)*C (4)
所以如果指针m从起始点A出发,指针n从相遇点C出发,n绕行(N-1)圈环之后最终跟m指针在B点相遇
解题:
struct Node {
int v;
Node *next;
};
Node* IsCycle(Node *head) {
Node *fast=head, *slow=head;
while(true) {
if(fast!=NULL)
fast=fast->next;
if(fast!=NULL)
fast=fast->next;
else
return NULL;
if(slow!=NULL)
slow=slow->next;
else
return NULL;
if(fast==slow)
return fast;
}
}
Node* FindEntry(Node *head, Node *joint) {
Node *m=head, *n=joint;
while(true) {
if(m==n)
return m;
m=m->next;
n=n->next;
}
}
int main() {
Node* b1=new Node(); b1->v=;
Node* b2=new Node(); b2->v=;b1->next=b2;
Node* b3=new Node(); b3->v=;b2->next=b3;
Node* b4=new Node(); b4->v=;b3->next=b4;
Node* b5=new Node(); b5->v=;b4->next=b5;
Node* b6=new Node(); b6->v=;b5->next=b6;
Node* b7=new Node(); b7->v=;b6->next=b7;
Node* b8=new Node(); b8->v=;b7->next=b8; b8->next=b3;
Node* temp;
if((temp=IsCycle(b1))!=NULL) {
printf("\nthe joint point is: %d",temp->v);
printf("\nthe entry of cycle is: %d",FindEntry(b1,temp)->v);
}
else
printf("\nthere is no cycle.");
return ;
}
出题:判断两棵二元树是否相等(左右子树不能交叉比较);
分析:使用递归实现,在树的K层,有2^K 个节点,所以会进行(2^K)*2次调用,所以时间复杂度为O(N);
解题:
struct Node {
int value;
Node *left;
Node *right;
};
bool CompareTree(Node *first, Node *second) {
if(first==NULL && second==NULL)
return true;
if((first==NULL && second!=NULL) ||
(first!=NULL && second==NULL))
return false;
if(first->value!=second->value)
return false;
return CompareTree(first->left,second->left) &&
CompareTree(first->right, second->right);
}
笔试算法题(27):判断单向链表是否有环并找出环入口节点 & 判断两棵二元树是否相等的更多相关文章
- 笔试算法题(25):复制拥有多个指针的链表 & 判断二元树B是否为A的子树
出题:定义一个复杂链表:在单向链表的基础上,每个节点附加一个指向链表中其他任意节点的指针sibling,实现CNode* Clone(Cnode *head)函数复制这个复杂链表: 分析: 解法1:将 ...
- 【算法题 14 LeetCode 147 链表的插入排序】
算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...
- 判断单链表是否有环,并找出环的入口python
1.如何判断一个链表是否有环? 2.如果链表为存在环,如果找到环的入口点? 1.限制与要求 不允许修改链表结构. 时间复杂度O(n),空间复杂度O(1). 2.思考 2.1判断是否有环 如果链表有环, ...
- 笔试算法题(19):判断两条单向链表的公共节点 & 字符集删除函数
出题:给定两个单向链表的头结点,判断其是否有公共节点并确定第一个公共节点的索引: 分析: 由于是单向链表,所以每个节点有且仅有一个后续节点,所以只可能是Y型交叉(每条链表中的某个节点同时指向一个公共节 ...
- 数据结构和算法之单向链表二:获取倒数第K个节点
我们在做算法的时候或多或少都会遇到这样的问题,那就是我们需要获取某一个数据集的倒数或者正数第几个数据.那么今天我们来看一下这个问题,怎么去获取倒数第K个节点.我们拿到这个问题的时候自然而然会想到我们让 ...
- 前端如何应对笔试算法题?(用node编程)
用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)
议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...
- 笔试算法题(38):并查集(Union-Find Sets)
议题:并查集(Union-Find Sets) 分析: 一种树型数据结构,用于处理不相交集合(Disjoint Sets)的合并以及查询:一开始让所有元素独立成树,也就是只有根节点的树:然后根据需要将 ...
随机推荐
- fiddler工具使用
一.安装 a) 百度fiddler ,下载, 安装 ,无脑流 二.界面介绍 a) 工具栏与状态栏 其中保存是,可以为两种形式:1.text文本形式 2.saz文件结尾数据(能被fiddler软件识别) ...
- SQL两个字段排序
ORDER BY 后可加2个字段,用英文逗号隔开. 1.f1用升序, f2降序,sql该这样写: 1 ORDER BY f1, f2 DESC 2.也可以这样写,更清楚: 1 ORDER BY ...
- Ocelot(七)- 入门
入门 Ocelot仅适用于.NET Core,目前是为netstandard2.0构建的.如果Ocelot适合您,那么此文档可能会有用. .NET 安装NuGet包 使用nuget安装Ocelot及其 ...
- ROS学习笔记一:ROS安装与测试
1 Ubuntu和ROS版本的对应关系 Ubuntu 和 ROS 都存在不同的版本,其对应关系如下: 注:如果Ubuntu版本和ROS版本不对应的话,安装就不会成功了- 笔者安装的是Ubuntu14. ...
- poj 2083 Fractal 递归 图形打印
题目链接: http://poj.org/problem?id=2083 题目描述: n = 1时,图形b[1]是X n = 2时,图形b[2]是X X X ...
- ES6的新方法实现数组去重
ES6里新添加了两个很好用的东西,set和Array.from. set是一种新的数据结构,它可以接收一个数组或者是类数组对象,自动去重其中的重复项目. 在这我们可以看见,重复的项目已经被去掉了,包括 ...
- vijos P1412多人背包 DP的前k优解
https://vijos.org/p/1412 把dp设成,dp[i][v][k]表示在前i项中,拥有v这个背包,的第k大解是什么. 那么dp[i][v][1...k]就是在dp[i - 1][v] ...
- 桥接模式和php实现
桥接模式(Bridge Pattern): 将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模 ...
- volley的框架安装与使用
最后一步非常重要 不然会报错: publish = project.has("release") 替换为: publish = project.hasProperty(&q ...
- wordpress在撰写新文章界面的显示选项按钮点击无反应的解决办法
原文链接:wordpress在撰写新文章界面的显示选项按钮点击无反应的解决办法 最近升级wordpress之后,发现在文章编辑界面的添加新媒体和可视化按钮点击无反应,如下: 然后就在网上找解决办法, ...