classSolution: defgetIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]: p, q = headA, headB while p isnot q: p = p.nextif p else headB q = q.nextif q else headA return p
206.反转链表(简单)
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
涉及知识点
链表
解决思路
很基本的题目,两种方法,从后往前,从前往后都可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution: defreverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: ifnot head or head.next==None: return head tmp = None
defdfs(cur: Optional[ListNode],tmp: Optional[ListNode]) -> Optional[ListNode]: if cur.next.next: tmp=dfs(cur.next,tmp) ifnot cur.next.next: tmp = cur.next cur.next.next = cur return tmp
tmp=dfs(head,tmp) head.next = None return tmp
1 2 3 4 5 6 7 8 9 10
classSolution: defreverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: pre = None cur = head while cur: nxt = cur.next cur.next = pre pre = cur cur = nxt return pre
234.回文链表(简单)
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
classSolution: # 876. 链表的中间结点 defmiddleNode(self, head: Optional[ListNode]) -> Optional[ListNode]: slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next return slow
# 206. 反转链表 defreverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: pre, cur = None, head while cur: nxt = cur.next cur.next = pre pre = cur cur = nxt return pre
defisPalindrome(self, head: Optional[ListNode]) -> bool: mid = self.middleNode(head) head2 = self.reverseList(mid) while head2: if head.val != head2.val: # 不是回文链表 returnFalse head = head.next head2 = head2.next returnTrue
141.环形链表(简单)
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
classSolution: # 876. 链表的中间结点 defmiddleNode(self, head: Optional[ListNode]) -> Optional[ListNode]: slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next return slow
# 206. 反转链表 defreverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: pre, cur = None, head while cur: nxt = cur.next cur.next = pre pre = cur cur = nxt return pre
defisPalindrome(self, head: Optional[ListNode]) -> bool: mid = self.middleNode(head) head2 = self.reverseList(mid) while head2: if head.val != head2.val: # 不是回文链表 returnFalse head = head.next head2 = head2.next returnTrue
classSolution: defdetectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]: slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next if fast is slow: # 相遇 while slow isnot head: # 再走 a 步 slow = slow.next head = head.next return slow returnNone