题目
给定一个链表,若其中包含环,则输出环的入口节点。
若其中不包含环,则输出null。
样例
链表中环的入口结点 - 图1
给定如上所示的链表:
[1, 2, 3, 4, 5, 6]
2
注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。
则输出环的入口节点3.

解法:双指针

设置两个指针同时从起点开始,慢指针每次走一步,快指针每次走两步,直到两个指针相遇
此时,再让其中一个指针回到起点,两个指针同时一步一步走,直到相遇,就来到了环的入口
也可以在第一次相遇后找出环的长度,然后让两个节点都从起点开始,其中一个先多走环的长度
时间复杂度O(n),空间复杂度O(1)

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode *entryNodeOfLoop(ListNode *head) {
  12. auto p = head, q = p;
  13. while (p && q) {
  14. p = p->next;
  15. q = q->next->next;
  16. if (p == q) {
  17. p = head;
  18. while (p != q) {
  19. p = p->next;
  20. q = q->next;
  21. }
  22. return p;
  23. }
  24. }
  25. return nullptr;
  26. }
  27. };