出题:判断一个单向链表是否有环,如果有环则找到环入口节点;

分析:

  • 第一个问题:使用快慢指针(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):判断单向链表是否有环并找出环入口节点 & 判断两棵二元树是否相等的更多相关文章

  1. 笔试算法题(25):复制拥有多个指针的链表 & 判断二元树B是否为A的子树

    出题:定义一个复杂链表:在单向链表的基础上,每个节点附加一个指向链表中其他任意节点的指针sibling,实现CNode* Clone(Cnode *head)函数复制这个复杂链表: 分析: 解法1:将 ...

  2. 【算法题 14 LeetCode 147 链表的插入排序】

    算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...

  3. 判断单链表是否有环,并找出环的入口python

    1.如何判断一个链表是否有环? 2.如果链表为存在环,如果找到环的入口点? 1.限制与要求 不允许修改链表结构. 时间复杂度O(n),空间复杂度O(1). 2.思考 2.1判断是否有环 如果链表有环, ...

  4. 笔试算法题(19):判断两条单向链表的公共节点 & 字符集删除函数

    出题:给定两个单向链表的头结点,判断其是否有公共节点并确定第一个公共节点的索引: 分析: 由于是单向链表,所以每个节点有且仅有一个后续节点,所以只可能是Y型交叉(每条链表中的某个节点同时指向一个公共节 ...

  5. 数据结构和算法之单向链表二:获取倒数第K个节点

    我们在做算法的时候或多或少都会遇到这样的问题,那就是我们需要获取某一个数据集的倒数或者正数第几个数据.那么今天我们来看一下这个问题,怎么去获取倒数第K个节点.我们拿到这个问题的时候自然而然会想到我们让 ...

  6. 前端如何应对笔试算法题?(用node编程)

    用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...

  7. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

  8. 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)

    议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...

  9. 笔试算法题(38):并查集(Union-Find Sets)

    议题:并查集(Union-Find Sets) 分析: 一种树型数据结构,用于处理不相交集合(Disjoint Sets)的合并以及查询:一开始让所有元素独立成树,也就是只有根节点的树:然后根据需要将 ...

随机推荐

  1. asp.net Identity2 角色(Role)的使用(二)角色管理,角色控制器和视图

    新建一个AdminViewModel 文件,建立视图模型类 public class RoleViewModel { public string Id { get; set; } [Required( ...

  2. NEFU 628 Garden visiting (数论)

    Garden visiting Problem:628  Time Limit:1000ms  Memory Limit:65536K Description There is a very big ...

  3. Gym 100512B Betting Fast (题意+概率)

    题意:你开始有 s 元钱,然后你要在 t 场内赚到 n 元,每次赢的概率是 p,并且要越快越好. 析:当时没注意这个条件,要越快越好,然后写概率dp,怎么看也不像是对.其实是每次赌 min(s, n- ...

  4. HDU 5916 Harmonic Value Description (构造)

    题意:给你 n 和 m,求一个1-n的排列,使得∑gcd(Ai,Ai+1) 恰为第  m 小. 析:可以想到最小的就是相邻都互质,然后依次,第 m 小就可以有一个是gcd为 k,然后其他的为1喽. 那 ...

  5. 洛谷 P3621 [APIO2007]风铃【贪心】

    没有算法,但是要注意细节. 首先无解的情况,显然的是最小深度的叶子节点和最大深度的叶子节点的深度差大于1:还有一种比较难想,就是如果一个点的左右子树都有最大和最小深度的叶子节点,这样交换左右子树也不行 ...

  6. Activiti6.0教程 Eclipse安装Activiti Diagram插件(一)

    最近这段时间打算出一个Activiti6.0的详细教程,Activiti作为一个流行的开源工作流引擎,正在不断发展,其6.0版本以API形式提供服务,而之前版本基本都是要求我们的应用以JDK方式与其交 ...

  7. __new__问题

    当类实例化的时候,通过__new__来创建对象空间, 如果实例化的时候带参数,那么__new__也是必须接受这个参数的,不接受会报错,而且这个__new__的返回值, 是传给__init__里面的se ...

  8. [USACO 2011 Nov Gold] Above the Median【逆序对】

    传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=91 这一题我很快的想出了,把>= x的值改为1,< x的改为- ...

  9. 通过Fiddler监控Java应用发送请求及相应数据

    Fiddler可以很好的监控浏览器发送的各种请求及响应数据,对于JAVA程序默认情况下是无法监控的,但实际需求中需要监控JAVA程序发送HTTP请求及返回数据是否正确. Fiddler默认配置的监听端 ...

  10. Android Dialogs(2)最好用DialogFragment创建Dialog

    Creating a Dialog Fragment You can accomplish a wide variety of dialog designs—including custom layo ...