Leetcode 141 & 142 环形链表Ⅰ、Ⅱ【链表】
Leetcode 141
1.思路
1)设置快慢指针,如果可以重合,则证明有环
2.代码
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def hasCycle(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if head == None:
return False
p = head #慢指针
q = head #快指针
while (p != None and q != None and q.next != None): #快指针走得更快,所以只需要q.next的判断即可
p = p.next
q = q.next.next
if(p == q):
return True
return False
Leetcode 142
1.思路
1)快慢节点向前前进,直到相遇
2)从头节点和相遇点分别设置一个指针,每次一个单位前进
3)再次相遇点就是入口
Note:只需要快慢指针,不需要额外空间
证明:2.代码
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head == None:
return None
p = head
q = head
while p != None and q != None and q.next != None:
p = p.next
q = q.next.next
if p == q:
p = head
while p != q:
p = p.next
q = q.next
return q
return None
链表暂时告一段落,明天开始【栈】系列。