【LeetCode】第41天 - 141. 环形链表

x33g5p2x  于2022-03-02 转载在 其他  
字(1.0k)|赞(0)|评价(0)|浏览(262)

题目描述

解题思路

方法一:Set集合

利用Set集合不存放重复元素的性质,我们遍历一次链表,每遍历一个节点就把他加入到Set集合中:

  • 如果添加失败,则说明节点重复出现(即存在环),返回true;
  • 如果成功遍历链表,就无环,返回false。

方法二:快慢指针

使用两个指针遍历链表,快指针每次前进两步,慢指针每次前进一步:

  • 如果链表存在环,快指针一定会于慢指针相遇,当快指针所指节点与慢指针所指节点相等时,就说明存在环,返回true;
  • 当快指针指向null时,遍历结束,说明无环,返回false;

代码实现

方法一:Set集合

  1. /**
  2. * Definition for singly-linked list.
  3. * class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) {
  7. * val = x;
  8. * next = null;
  9. * }
  10. * }
  11. */
  12. public class Solution {
  13. public boolean hasCycle(ListNode head) {
  14. Set<ListNode> set = new HashSet<ListNode>();
  15. while(head!=null) {
  16. if(!set.add(head)){
  17. return true;
  18. }
  19. head = head.next;
  20. }
  21. return false;
  22. }
  23. }

方法二:快慢指针

  1. /**
  2. * Definition for singly-linked list.
  3. * class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) {
  7. * val = x;
  8. * next = null;
  9. * }
  10. * }
  11. */
  12. public class Solution {
  13. public boolean hasCycle(ListNode head) {
  14. if(head == null || head.next == null){
  15. return false;
  16. }
  17. ListNode slower = head; //慢指针
  18. ListNode faster = head.next; // 快指针
  19. while(faster!=null && faster.next!=null){ //遍历结束
  20. if(slower == faster){ //快慢指针相遇,存在环
  21. return true;
  22. }
  23. slower = slower.next; //慢指针前进一步
  24. faster = faster.next.next; //快指针前进两步
  25. }
  26. return false;
  27. }
  28. }

相关文章