classSolution: defreverseList(self, head: ListNode) -> ListNode: cur, pre = head, None while cur: tmp = cur.next#临时存后继节点 cur.next = pre #修改next指向 pre = cur #pre变为cur cur = tmp #前进到下一个节点 return pre
递归
O(N),遍历
1 2 3 4 5 6 7 8
classSolution: defreverseList(self, head: ListNode) -> ListNode: defrecur(cur, pre): ifnot cur: return pre #递归终止条件 res = recur(cur.next, cur) #递归后继节点 cur.next = pre #修改next指向 return res #返回反转链表的头节点 return recur(head, None)
Java
双指针
1 2 3 4 5 6 7 8 9 10 11 12
classSolution { public ListNode reverseList(ListNode head) { ListNodecur= head, pre = null; while(cur != null){ ListNodetmp= cur.next; //临时存后继节点 cur.next = pre; //修改next指向 pre = cur; //pre变为cur cur = tmp; //前进到下一个节点 } return pre; } }
classSolution: defreverseLeftWords(self, s: str, n: int) -> str: res = [] for i inrange(n, len(s)): res.append(s[i]) for i inrange(n): res.append(s[i]) return''.join(res)
Java
O(N),substring切片
1 2 3 4 5
classSolution { public String reverseLeftWords(String s, int n) { return s.substring(n,s.length()) + s.substring(0,n); } }
O(N),遍历拼接
1 2 3 4 5 6 7 8 9 10 11 12
classSolution { public String reverseLeftWords(String s, int n) { StringBuilderres=newStringBuilder(); for(inti= n; i < s.length; i++){ res.append(s.charAt(i)); } for(inti=0; i< n; i++){ res.append(s.charAt(i)); } return s.toString(); } }
4.查找算法
剑指03.数组中重复的数字
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
classSolution: defsearch(self, nums: List[int], target: int) -> int: i = 0 j = len(nums) - 1 while i <= j: m = (i + j) // 2 if nums[m] <= target: i = m + 1 else: j = m - 1 right = i if j >= 0and nums[j] != target: return0 i = 0 while i <= j: m = (i + j) // 2 if nums[m] < target: i = m + 1 else: j = m - 1 left = j return right - left -1
根据题意,下标和元素应该是相同的。二分,左子数组: nums[i] = i, 右子数组:nums[i] != i。 缺失的数字就是右子数组首个元素的下标
1 2 3 4 5 6 7 8 9 10
classSolution: defmissingNumber(self, nums: List[int]) -> int: i, j = 0, len(nums) - 1 while i <= j: m = (i + j) // 2 if nums[m] == m: i = m + 1 else: j = m - 1 return i
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { publicintmissingNumber(int[] nums) { inti=0, j = nums.length - 1; while(i <= j){ intm= (i + j) / 2; if(nums[m] == m){ i = m + 1; }else{ j = m - 1; } } return i; } }