环形链表判断有无环的追击相遇问题

 我们这里用一道题目为例子给大家讲解

typedef struct ListNode ListNode;

bool hasCycle(struct ListNode* head) {
    ListNode *fast = head, *slow = head;
    while (fast && fast->next) {
 
        fast = fast->next->next;
        slow = slow->next;
          if (fast == slow) {
            return true;
        }
     
    }
    return false;
}

 我们大致可以看出只需要一个快慢指针去让他们不停的的跑,能够相遇就是链表中有环,如果相遇不到就没有环。

如果快指针每次走三次或多次,那么有没有今年他们一直都遇不到呢?

我们用这里面用数学的思维来判断,假设圈的长度为C,在慢指针进入圈的时候两个指针的距离为N。

我们可以知道

我们知道慢指针每走一次,快指针走三次。

慢指针的距离是L

假设快指针在圈里面走了x次

3L =L+x*c+c-N

可以化简为

2L =x*c+c-N也是

2L=(X+1)*c-N

左边一定为偶数,右边也要是偶数

所以无法N和C为不同的数,由此可知他们一定会相遇。

结论

追击相遇问题通常涉及到两个物体(比如船、车辆或其他移动对象)在直线上按照某种速度进行运动,它们可能从同一位置出发,或者一方开始时位于另一方前方或后方。要使用Python来解决这类问题,你需要考虑以下几点: 1. **初始条件**:包括每个物体的速度(v1和v2)、初始位置(x10和x20)以及他们是否同时开始。 2. **方向**:假设两者都是朝相同的方向移动,如果相反,则需要调整速度和方向。 3. **时间计算**:可以通过距离除以速度来找到相遇所需的时间。如果两者的速度不同,那么快者会在较短的时间内赶上慢者。 4. **更新位置**:根据时间和各自的起始位置,计算出每个物体在给定时间后的最终位置。 5. **检查条件**:每次更新后,都需要判断是否已经相遇。如果其中一个物体的位置等于另一个物体的位置,或者超出另一个物体的预期范围,那么就达到了相遇点。 这里是一个简单的例子,假设两个物体在同一起点,一个静止,另一个以恒定速度追击: ```python def chase_problem(speed_of_chaser, speed_of_follower, distance_between): # 假设chaser在前,follower在后 chaser_position = 0 follower_position = distance_between # 更新时间并计算新位置 def update_positions(time): nonlocal chaser_position, follower_position chaser_position += speed_of_chaser * time follower_position += speed_of_follower * time # 直到chaser到达follower的位置或者超过 while chaser_position <= follower_position: time_to_meet = (follower_position - chaser_position) / (speed_of_chaser - speed_of_follower) update_positions(time_to_meet) if chaser_position == follower_position: break return chaser_position, follower_position # 示例用法 speed_of_chaser = 10 speed_of_follower = 5 distance_between = 50 final_positions = chase_problem(speed_of_chaser, speed_of_follower, distance_between) print(f"Chaser's final position: {final_positions[0]}, Follower's final position: {final_positions[1]}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值