力扣Day4(1.29)| 第二章 链表 ( 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II )
链接
视频总结
关键点
- 快慢指针的思路来源:若是没有环,则快慢指针不可能相遇;若是有环,根据相对速度,则慢指针一定会被快指针追上
- 本题有两个问题,是否有环?和环在哪
- 相遇先设置指针一,起点设置指针二,则两指针以相同的速度前进的交点就是环的入口
- 为何快指针一定在第一圈就追上了满指针,也就是满指针走的距离为什么只是x+y?
编程思路
Me:
- 设置快慢指针,找到交点,记为index1
- 起点记为index2,同速向前走,相交时返回交点
漏洞:
1.默认路径是勺子形状,即忽略了收尾相连的情况,导致编程错误
2.少考虑了空链表的情况
卡尔:
力扣实战
思路一:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
fast = slow = index2 = head
while fast and fast.next:
if fast.next.next == slow.next:
index1 = slow.next
if index1 == index2:
return index2
else:
while index1.next != index2.next:
index2 = index2.next
index1 = index1.next
return index1.next
else:
fast = fast.next.next
slow = slow.next
return None
# 反思1:
文档总结
1. 不同写法(思路基本一致)
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# 如果相遇
if slow == fast:
p = head
q = slow
while p!=q:
p = p.next
q = q.next
#你也可以return q
return p
return None