一、 240. 搜索二维矩阵 II
1. 解题思路
本题采用二分查找的方法。
(1)对矩阵的每一行进行二分查找,首先定义出左边界和右边界的变量,然后计算出中间元素的下标索引,将中间元素与target元素值进行比对。
(2)如果中间元素比target大,那么需要在中间元素的左边区间进行二次二分查找,也就是将右边界的下标更改为mid-1;如果中间元素比target小,那么需要在中间元素的右边区间进行二次二分查找,也就是将左边界的下标更改为mid+1;如果中间元素等于target,查找到了目标值,返回true。
(3)如果遍历完所有元素都没有返回true,那么直接返回false。
2. 代码实现
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
for row in range(len(matrix)):
left, right = 0, len(matrix[0])-1
while left <= right:
mid = left +(right-left)//2
if matrix[row][mid]==target:
return True
elif matrix[row][mid] > target:
right = mid- 1
else:
left =mid+1
return False
二、160.相交链表
1. 解题思路
(1)定义两个指针A和B分别用于遍历链表headA和链表headB,假设链表headA有a个节点,链表headB有b个节点,公共节点尾部有c个节点。
(2)判断链表是否相交的关键点:用指针A先去遍历链表headA后再去遍历链表headB,但只需要走到到公共节点处,此时A走了a+(b-c)步;用指针B先去遍历链表headB后再去遍历链表headA,但只需要走到到公共节点处,此时B走了b+(a-c)步。此时,a+(b-c) = b+(a-c)时,说明A、B指针重合,链表相交。
(3)相交也存在两种情况:一是A、B指针同时走到公共节点,二是A、B指针不相交,指向NULL,所以只需要返回指针A即可。
2. 代码实现
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode)->Optional[ListNode]:
A = headA
B = headB
while A!=B:
A = A.next if A else headB
B = B.next if B else headA
return A
三、206.反转链表
1. 解题思路
(1)定义一个pre指针指向head前的None,定义一个cur指针指向头节点head,表示当前遍历的节点。
(2)只要cur指针存在,就一直进行反转循环:首先定义一个临时指针next用于存放cur.next的值,然后将cur.next指向pre,完成方向反转;接下来为了进入下一次反转,将pre移动到cur,将cur移动到next。
(3)最后,pre会成为反转后的头节点,返回pre即可。
2. 代码实现
class ListNode:
def __init__(self, val = 0, next = None):
self.val = val
self.next = None
class Solution:
def reverseList(self, head: Optional[ListNode])->Optional[ListNode]:
pre, cur = None, head
while cur:
next = cur.next
cur.next = pre
pre = cur
cur = next
return pre