剑指offer[52、53-1、53-2]

剑指 Offer 52. 两个链表的第一个公共节点

题目

在这里插入图片描述

思路

在这里插入图片描述

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode node1=headA;
        ListNode node2=headB;
        while(node1!=node2){
            node1= node1!=null? node1.next:headB;
            node2= node2!=null? node2.next:headA;
        }
        return node1;
        
    }
}
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        node1,node2=headA,headB
        while node1!=node2:
            node1=node1.next if node1 else headB
            node2=node2.next if node2 else headA
        return node1

剑指 Offer 53 - I. 在排序数组中查找数字 I

题目

在这里插入图片描述

代码(二分查找)

class Solution {
    public int search(int[] nums, int target) {
        // 二分法查找
        if(nums==null) return 0;
        int i=0,j=nums.length-1;
        // 查找待查数字的右边界
        while(i<=j){
            int m=(i+j)/2;
            if(nums[m]<=target) i=m+1;
            else j=m-1;
        }
        // 此时返回的i为最后一个target后一位,j指向最后一位target
        int right=j;
        // 判断数组中是否存在target,如果不存在直接返回结果,节省时间
        if(j>=0&&nums[right]!=target) return 0;
        int a=0,b=nums.length-1;
        while(a<=b){
            int m=(a+b)/2;
            if(nums[m]<target) a=m+1;
            else b=m-1;
        }
        // 此时返回的a指向第一位target,b指向第一位target前一位
        int left=b;
        return right-left;
    }
}
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        if nums==None: return 0
        i,j=0,len(nums)-1
        while i<=j:
            m=(i+j)//2
            if nums[m]<= target:i=m+1
            else:j=m-1
        right=j
        if j>=0 and nums[j]!=target: return 0
        a,b=0,len(nums)-1
        while a<=b:
            m=(a+b)//2
            if nums[m]< target:a=m+1
            else: b=m-1

        left=b
        return right-left

剑指 Offer 53 - II. 0~n-1中缺失的数字

题目(二分查找)

在这里插入图片描述

代码

class Solution {
    public int missingNumber(int[] nums) {
        int i=0,j=nums.length-1;
        while(i<=j){
            int m=(i+j)/2;
            if(nums[m]==m) i=m+1;
            else j=m-1;
        }
        return i;
    }
}
class Solution:
    def missingNumber(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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值