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

分析:

  • 第一个问题:使用快慢指针(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. Linux 常用命令二 pwd cd

    一.pwd命令 显示整个路径名: wang@wang:~$ pwd /home/wang 二.cd命令 切换到其他路径(相对路径方式): wang@wang:~$ cd workpalce/ wang ...

  2. window 下拉取github项目失败 (Permission denied (publickey))

    原因是github 帐号ssh 失效或者没有配置 1.找到gitcmd 并进入 2.在gitcmd 下切换到 安装git路劲\Git\usr\bin 3.提示在C:\Users\Administrat ...

  3. NOI2018D2T1 屠龙勇士

    安利一下松松松的OJ: 传送门 Description: ​ 有N条巨龙, 对于每个龙含有\(a_i\)的生命, 你有N + M把砍刀, 其中M把是直接给你的, N把是杀死对应的巨龙才能获得的, 每把 ...

  4. Hdu 5384 Danganronpa (AC自动机模板)

    题目链接: Hdu 5384 Danganronpa 题目描述: 给出n个目标串Ai,m个模式串Bj,问每个目标串中m个模式串出现的次数总和为多少? 解题思路: 与Hdu 2222  Keywords ...

  5. JAVA大数处理(BigInteger,BigDecimal)

    原文链接 Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类. 这两个类都在java.math.*包中,因此每次必须在开头处引用该包. Ⅰ基本函数: 1.valu ...

  6. 牛客小白月赛5-J-时间(time) (简单模拟)

    题目描述 Apojacsleam是一个喜欢特殊时刻的人. 他定义了一个时刻,若电子表显示ab:ba(24小时制),则该时刻为“回文时刻”(可以有前导零).例如00:00就是回文时刻. 给定一个时刻,求 ...

  7. 题解报告:hdu 2059 龟兔赛跑

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059 Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击—— ...

  8. Android推送服务(1)几种实现方式

    1.几种常见的解决方案实现原理 1)轮询(Pull)方式:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等.而且你还要考虑轮询的频率,如果 ...

  9. 转】用Hadoop构建电影推荐系统

    原博文出自于: http://blog.fens.me/hadoop-mapreduce-recommend/ 感谢! 用Hadoop构建电影推荐系统 Hadoop家族系列文章,主要介绍Hadoop家 ...

  10. "言官误国"

    "言官误国" 之前读<明朝那些事儿>的时候,了解到了一个全新的概念,确切的说与之前的印象完全不符合的概念:言官.之前我印象中的言官都是魏征那样的人,为国为民.冒死直谏等 ...