leetcode:142. 环形链表 II
2019-04-22 09:24
357 查看
- 题目描述
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
- 思路
假设环形链表如上图所示,有两个指针:快指针一次走两步,慢指针一次走一步。如果有环,它们必定会相遇。则可以推出ab+2bc+cb=2(ab+bc) =》ab=bc (以上假定快指针比慢指针多走了一圈,如果多走n圈,则推出ab=cb+n(bc+cb))。因此,我们先利用快慢指针求出相遇的位置,则让两个指针一个从头开始,一个从相遇点开始,以相同速度出发,他们相遇的点即为环的入口。
- c++实现
#include <iostream> using namespace std; struct ListNode{ int val; ListNode *next; ListNode(int x):val(x),next(NULL){} }; ListNode *detectCycle(ListNode *head) { ListNode *fast=head; ListNode *slow=head; while(fast!=NULL && fast->next!=NULL) { fast=fast->next->next; slow=slow->next; if(fast==slow) break; } if(fast==NULL||fast->next==NULL) return NULL; slow=head; while(slow!=fast) { slow=slow->next; fast=fast->next; } return slow; } int main() { ListNode *head=new ListNode(3); head->next=new ListNode(2); head->next->next=new ListNode(0); head->next->next->next=new ListNode(-4); head->next->next->next->next=head->next; ListNode *newl=detectCycle(head); cout<<newl->val<<endl; return 0; }
相关文章推荐
- Leetcode 142.环形链表II
- leetcode142. 环形链表 II(环的第一个节点),O(N)时间复杂度与O(1)空间复杂度
- 【LeetCode题解】142_环形链表2(Linked-List-Cycle-II)
- 【LeetCode】#142环形链表II(Linked List Cycle II)
- 利用python 完成 leetcode142 环形链表 II
- (1)LeetCode之 142.环形链表II
- leetcode-环形链表II(python)
- leetcode:单链表之Reverse Linked List II
- 闲话链表(二) leetcode 之 Reverse Linked List II
- Leetcode Reverse Linked List II 反转特定区间的链表
- 【leetcode】【单链表】【92】Reverse Linked List II
- Leetcode 92. Reverse Linked List II 翻转链表2 解题报告
- LeetCode-92-Reverse Linked List II 链表反转 各种边界条件
- [LeetCode]93. Linked List Cycle II查找链表中环的起始节点
- C实现 LeetCode->Reverse Linked List II (双指针大法)(单链表反转)
- 【Leetcode】82 Remove Duplicates from Sorted List II 【指针&链表】
- 编程集训第2天:LeetCode--环形链表2(142)及单链表反转(206)C++和python代码实现
- leetcode 环形链表
- LeetCode-82-Remove Duplicates from Sorted List II 链表
- 从leetcode 92.reverse-linked-list-ii 对链表的认识