Leetcode 141. 环形链表

141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com)

 

 

思路 1 快慢指针:

1. 设置两个指针,一个一次走一步,一个一次走两步。

2. 如果这个链表有环,那么快指针就一定会在某一个节点从后面追上慢指针。

3. 如果快指针可以指向nil, 那么这个链表就不是一个环形链表。

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func hasCycle(head *ListNode) bool {
	if head == nil || head.Next == nil {
		return false
	}
	slow := head
	fast := head.Next
	for fast != nil && fast.Next != nil {
		fast = fast.Next.Next
		slow = slow.Next
		if fast == slow {
			return true
		}
	}
	return false
}

 

思路 2 哈希表法

1. 对链表进行遍历。

2. 每遍历一个链表节点就将它存到哈希表中。

3.如果在插入哈希表时发现这个节点已经存在,则说明这个链表有环。

 

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func hasCycle(head *ListNode) bool {
	hashMap := make(map[*ListNode]int)
	for head != nil {
		if _, ok := hashMap[head]; ok {
			return true
		}
        hashMap[head]=0 
		head = head.Next
	}
	return false
}

  

posted @ 2022-04-24 14:18  SoutherLea  阅读(22)  评论(0编辑  收藏  举报