题意:

image.png

解题思路:

  1. 思路:
  2. 1. 快慢指针思想:如果有环,快指针必定会追上慢指针;
  3. 2. hash:存储每一个节点,如果遍历到后面存在相同值,则判断为环,如果能走到最后,直到为空,则判断无环;

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 Boolean
  13. */
  14. function hasCycle($head) {
  15. $fast = $head;
  16. $slow = $head;
  17. while ($fast != null && $fast->next != null) {
  18. $slow = $slow->next;
  19. $fast = $fast->next->next;
  20. if ($slow == $fast) {
  21. return true;
  22. }
  23. }
  24. return false;
  25. }
  26. function hasCycleHash($head) {
  27. $hash = [];
  28. while ($head) {
  29. if (in_array($head, $hash)) return true;
  30. $hash[] = $head;
  31. $head = $head->next;
  32. }
  33. return false;
  34. }
  35. }

GO代码实现:

  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func hasCycle(head *ListNode) bool {
  9. hasCycleHash(head)
  10. if head == nil {
  11. return false
  12. }
  13. slow, fast := head, head.Next
  14. for slow != nil && fast != nil && fast.Next != nil {
  15. if slow == fast {
  16. return true
  17. }
  18. slow = slow.Next
  19. fast = fast.Next.Next
  20. }
  21. return false
  22. }
  23. func hasCycleHash(head *ListNode) bool {
  24. hash := make(map[*ListNode] int)
  25. for head != nil {
  26. if _,ok := hash[head]; ok {
  27. return true
  28. }
  29. hash[head] = head.Val
  30. head = head.Next
  31. }
  32. return false
  33. }