142. Linked List Cycle II
2017-11-03 17:14
330 查看
这道题依旧是关于链表的环,不同的是这次是要找出环开始的节点。
两个节点相遇的时候不一定是环开始的地方,所以不能发现fast==slow之后就直接返回,肯定是不对。参照下图:
X是链表头,Y是环开始的地方,Z是相遇的地方。
在相遇的时刻,slow走了a+b,fast走了a+n(b+c)+b。slow这个好理解,fast这个因为相遇之前肯定fast转了几圈,所以有n(b+c)这一项。
所以可以得到:
2*(a + b) = a + b + n * (b + c)。由这个式子可以得到:a=(n - 1) * b + n * c = (n - 1)(b + c) +c。
这个式子可以看出,如将此时两指针分别放在起始位置和相遇位置,并以相同速度前进,当一个指针走完距离a时,另一个指针恰好走出 绕环n-1圈加上c的距离。
故两指针会在环开始位置相遇。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *detectCycle(ListNode *head) { ListNode* fast = head, *slow = head; while(fast != NULL && fast->next != NULL){ slow = slow->next; fast = fast->next->next; if(slow == fast) break; } if(fast == NULL || fast->next == NULL) return NULL; slow = head; while(slow != fast){ slow = slow->next; fast = fast->next; } return slow; } };
相关文章推荐
- LinkedList-142-Linked List Cycle II
- [leetcode]142 Linked List Cycle II
- LeetCode142:Linked List Cycle II
- leecode 解题总结:142. Linked List Cycle II
- leetcode-141-142 Linked List Cycle I II
- [LeetCode]题解(python):142-Linked List Cycle II
- [leetcode-142]Linked List Cycle II(c)
- LeetCode 142: Linked List Cycle II
- 关于Linked List Cycle II (leetcode 142) 的几点思考
- [leedcode 142] Linked List Cycle II
- LeetCode142—Linked List Cycle II
- leetcode 142 —— Linked List Cycle II
- 142. Linked List Cycle II
- leetcode[141&142]:Linked List Cycle I & II
- Leetcode#142(链表)-Linked List Cycle II
- LeetCode 141 Linked List Cycle和142 Linked List Cycle II
- 【LeetCode】142 - Linked List Cycle II
- LeetCode 142 Linked List Cycle II
- 142. Linked List Cycle II
- leetCode #142 Linked List Cycle II