classSolution: defgetIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: a,b=headA,headB while a!=b: a=a.nextif a else headB b=b.nextif b else headA return a
2.链表反转
题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 思路:双指针,改变next
1 2 3 4 5 6 7 8 9
classsolution: defreverseList(self,head:ListNode)->ListNode: a,b=head,None while a: t=a.next a.next=b b=a a=t return b
3.回文链表
题目:给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 思路:堆栈,将链表压入堆栈,然后依次弹出,判断是否相等
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution: defisPalindrome(self,head:ListNode)->bool: stack=[] a=head while a: stack.append(a) a=a.next b=head while stack: c=stack.pop() if c.val!=b.val: returnFalse b=b.next returnTrue
4.环形链表
题目:给你一个链表的头节点 head ,判断链表中是否有环。 思路:哈希表存储,判断有无重复结点
1 2 3 4 5 6 7 8 9
classSolution: defhasCycle(self,head:ListNode)->bool a=set() #集合 set 本质就是去掉 value 的哈希表 while head: if head in a: returnTrue a.add(head) head=head.next returnFalse
classSolution: definorderTraversal(self, root: TreeNode) -> List[int]: if root isNone: return [] stack=[] res=[] a=root while a or stack: while a: stack.append(a) a=a.left a=stack.pop() res.append(a.val) a=a.right return res
classSolution: defisSymmetric(self,root: Optional[TreeNode])->bool: ifnot root: returnTrue defifmirror(left,right): ifnot left andnot right: returnTrue ifnot left ornot right or left.val!=right.val: returnFalse return ifmirror(left.left,right.right) and ifmirror(left.right,right.left) return ifmirror(root.left,root.right)
#二分查找 classSolution: defsearchInsert(self, nums: List[int], target: int) -> int: l, r = 0, len(nums) while l < r: mid = (l + r) // 2 if nums[mid] < target: l = mid + 1 else: r = mid return l
滑动窗口
1. 最长无重复子串
给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。 思路:使用滑动窗口,窗口内无重复字符则更新最大长度,有重复字符则移动窗口的左边界,直到无重复字符。 白话:我们维护一个窗口 [left, right],满足硬性规则:✅ 窗口内所有字符,不存在重复,right 一直往右走(正常遍历字符串);一旦发现当前字符char已经存在窗口里面:就要把窗口左边界left挪到【上一次这个字符位置的下一位】,把旧的重复字符踢出窗口。 abca
1 2 3 4 5 6 7 8 9 10 11 12
classSolution: deflengthOfLongestSubstring(self, s: str) -> int: dic,res,i={},0,-1 for j inrange(len(s)): #取长度记得用len if s[j] indir: i=max(i,dic[s[j]]) dic[s[j]]=j res=max(res,j-i) return res sol = Solution() s = input("请输入字符串:") print(sol.lengthOfLongestSubstring(s))
栈
1. 有效的括号
题目:给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。 有效:左与右相同闭合,且必须以正确顺序闭合。 思路:用栈存储,是左括号就入栈,不是括号就弹出,最后判断栈是否为空
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
s=input("请输入字符串:") classSolution: defisValid(self, s:str)->bool: dic={'(':')','[':']','{':'}'} stack=[] for c in s: if c in dic: stack.append(c) elifnot stack : returnFalse elif dic[stack.pop()]!=c: #栈空的时候绝对不能 pop returnFalse returnnot stack a=Solution() print(a.isValid(s))
classSolution: defremove(self, s: str) -> str: stack=[] for c in s: stack.append(c) iflen(stack)>=3: if stack[1]==stack[3] and stack[1]!=stack[2]: stack.pop() stack.pop() stack.pop() return"".join(stack)