linked list cycle(leetcode)
来源:互联网 发布:ubuntu如何解压缩 编辑:程序博客网 时间:2024/05/17 03:35
Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
Follow up:
Can you solve it without using extra space?
这道题目可以用歪理来做,即遍历点,凡是已经遍历过的点就用一个特殊数标记,当遍历点数值为特殊值时,此点即为链表成环的起点。可以使用一个少见的特殊值,-2147483648(这个数值应该很少见吧。。。)当然这种方法会改变链表的value值,应该是不可取的。
class Solution {public: ListNode *detectCycle(ListNode *head) { while( head != NULL && head -> val != -2147483648 ) { head -> val = -2147483648; head = head -> next; } if( head == NULL ) return NULL; else return head; }};
class Solution {public: ListNode *detectCycle(ListNode *head) { ListNode *p1 = head,*p2 = head; do{ if( p1 == NULL || p2 == NULL ) return NULL; p1 = p1 -> next; if( p2 -> next == NULL ) return NULL; else p2 = p2 -> next -> next; }while( p1 != p2 ); p1 = head; while( p1 != p2 ) { p1 = p1 -> next; p2 = p2 -> next; } return p1; }
如图,若存在cycle,则head为A,cycle起点为B,取两指针p1,p2,p1每次走一步,p2每次走两步,若相遇在C点
则有 2×(a + n(b + c) + b) == a + b + m(b+c)
即a = (m - n)×(b + c) - b
= (m - n - 1) + c
此时再将p1设置为head,p1,p2同时同速走p1走完a路程时候p2正好走完整数圈+c路程两指针相遇在B点即起点上
0 0
- leetcode Linked List Cycle & Linked List Cycle ||
- 【LeetCode】Linked List Cycle
- Leetcode: Linked List Cycle
- Leetcode Linked List Cycle
- Leetcode: Linked List Cycle
- LeetCode:Linked List Cycle
- [LeetCode]Linked List Cycle
- LeetCode | Linked List Cycle
- Leetcode: Linked List Cycle
- LeetCode: Linked List Cycle
- LeetCode - Linked List Cycle
- [LeetCode] - Linked List Cycle
- LeetCode - Linked List Cycle
- [LeetCode]Linked List Cycle
- 【LeetCode】Linked List Cycle
- Linked List Cycle - LeetCode
- 【LeetCode】Linked List Cycle
- Linked List Cycle -- LeetCode
- 实战Nginx与PHP(FastCGI)的安装、配置与优化
- ProgressDialog使用总结
- IOS之MD5加密
- 程序支持mysql 5.7.3 成功,提供下载
- Linux 环境下查看硬件信息的命令
- linked list cycle(leetcode)
- 转——Windows平台MonkeyTalk环境搭建
- ProgressDialog使用总结
- 如何有效的利用清晨时间
- 修改ACE的Reactor模式示例中的参数后测试,依据测试结果,猜测Reactor似乎可以突破62个事件的限制。但是...
- CCS环境下Omapl138捕获单元应用
- 大学生励志创业成为破烂王
- 基于S3C2440芯片linux系统下的ds18b20设备驱动
- Android: 通过Runtime.getRuntime().exec调用底层Linux下的程序或脚本