Linked List Cycle II
2015-08-25 10:41
295 查看
Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
Note: Do not modify the linked list.
Follow up:
Can you solve it without using extra space?
解题思路:
(1)用快慢指针判断链表是否有环,快指针每次走2步,慢指针每次走1步,若两者相遇则有环,若遇到NULL则没环
(2)如果有环,计算换的长度count
(3)回到链表头,用先后指针寻找环入口结点,先指针先走count步,然后先后指针以相同的速度移动,当两者相遇时就是环的入口结点
struct ListNode *detectCycle(struct ListNode *head) {
}
Note: Do not modify the linked list.
Follow up:
Can you solve it without using extra space?
解题思路:
(1)用快慢指针判断链表是否有环,快指针每次走2步,慢指针每次走1步,若两者相遇则有环,若遇到NULL则没环
(2)如果有环,计算换的长度count
(3)回到链表头,用先后指针寻找环入口结点,先指针先走count步,然后先后指针以相同的速度移动,当两者相遇时就是环的入口结点
struct ListNode *detectCycle(struct ListNode *head) {
bool flags = false; int count = 1; struct ListNode *slowpNode = head; struct ListNode *fastpNode = head; //寻找是否有环 while ((fastpNode != NULL) && (fastpNode->next != NULL)) { slowpNode = slowpNode->next; fastpNode = fastpNode->next->next; if (slowpNode == fastpNode) { flags = true; break; } } if (!flags) return NULL; //判断环的长度 fastpNode = fastpNode->next; while (slowpNode != fastpNode) { count++; fastpNode = fastpNode->next; } //寻找环的入口结点 slowpNode = head; fastpNode = head; while (count--) { fastpNode = fastpNode->next; } while (slowpNode != fastpNode) { slowpNode = slowpNode->next; fastpNode = fastpNode->next; } return slowpNode;
}
相关文章推荐
- VC 在WIN7下使用ADO方式连接ACCESS数据库到XP不能运行
- [转载] ORACLE 多表关联 UPDATE 语句
- [Jquery]判断数据类型
- 使用反射构造对象实例并动态调用方法
- easyUI跨tab刷新datagrid
- unity3d5.1物体椭圆旋转选择界面实现(一)
- 快速排序Quicksort Array in Java
- POJ 1595 && HDU 1319 Prime Cuts(数论)
- hdu 1671
- Servlet的response输出到页面时乱码的解决方法
- Linux中常用操作命令
- PHPExecl操作
- java ubantu
- Java NIO 为什么比IO快
- Linux(Ubuntu)下MySQL的安装与配置
- block 深入理解
- JavaScript中通过getElementsByName访问name集合对象
- CNN+RNN
- Mysql主从服务器原理及配置
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理