Hot 100 | 240. 搜索二维矩阵 II、160.相交链表、206.反转链表

一、 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.相交链表

160. 相交链表 - 力扣(LeetCode)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值