题意:

image.png

解题思路:

  1. 思路:快慢指针
  2. 1. 快慢指针指向头结点,快指针走两步,慢指针走一步,直到相遇,证明有环;
  3. 2. 重新定义快指针指向头节点,两者同时走一步,直到相遇则是环的第一个节点;

PHP代码实现:

  1. /**
  2. * Definition for a singly-linked list.
  3. * class ListNode {
  4. * public $val = 0;
  5. * public $next = null;
  6. * function __construct($val) { $this->val = $val; }
  7. * }
  8. */
  9. class Solution {
  10. /**
  11. * @param ListNode $head
  12. * @return ListNode
  13. */
  14. function detectCycle($head) {
  15. //hash存储
  16. $hash = [];
  17. $node = $head;
  18. while ($node != null) {
  19. if(in_array($node, $hash)){
  20. return $node;
  21. }
  22. $hash[] = $node;
  23. $node = $node->next;
  24. }
  25. return false;
  26. }
  27. function detectCycleFastSlow($head) {
  28. $fast = $head;
  29. $slow = $head;
  30. while (true) {
  31. if ($fast === null || $fast->next === null) return null;
  32. $fast = $fast->next->next;
  33. $slow = $slow->next;
  34. if ($fast === $slow) {
  35. break;
  36. }
  37. }
  38. $fast = $head;
  39. while ($fast !== $slow) {
  40. $fast= $fast->next;
  41. $slow = $slow->next;
  42. }
  43. return $fast;
  44. }
  45. }

GO代码实现:

  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func detectCycle(head *ListNode) *ListNode {
  9. cur := head
  10. fast, slow := cur, cur
  11. isCircle := false
  12. for fast != nil && fast.Next != nil {
  13. fast = fast.Next.Next
  14. slow = slow.Next
  15. if fast == slow {
  16. isCircle = true
  17. break
  18. }
  19. }
  20. if isCircle {
  21. slow = cur
  22. for fast != slow {
  23. fast = fast.Next
  24. slow = slow.Next
  25. }
  26. return slow
  27. }
  28. return nil
  29. }