qt的xml中怎么创建一个空节点?_数组与链表-中(双指针)

如果要介绍关于链表和数组的算法题,双指针技巧是一定要先了解的

什么是双指针技巧?

双指针技巧并不是一种具体的算法,而是一种思路,用一道题目能够很好地理解双指针的概念。

删除链表的倒数第N个节点

10609d73007891994db331a67579e265.gif

可以看到最开始有两个指针p和q同时指着一个空的链表头(虚拟节点),程序运行时,先让q往前走N个位置停住,之后p和q按照一步的频率同时往前移动,当指针q走到链表末尾时,删除p连接的“后车厢”,接上“新车厢”完成题目。

双指针技巧大体有两类,分为快慢指针和左右指针。

  • 快慢指针:两个指针同时朝一个方向移动,一个在前一个在后
  • 左右指针:一个指针在头,一个指针在尾,同时向中间移动

而一种叫做滑动窗口的技巧就是由双指针技巧所演化而来。

怎么使用双指针技巧?

接下来列举一些关于链表的常见算法题

141.环形链表

给定一个链表,判断链表中是否有环。

cacbcbcdd0def3f0b1c0270e14e899ab.png
图源leetcode

有时候链表的铰链会连接到前面的车厢,当你想要遍历这个链表的时候就会死循环。

解法:在链表头创建两个指针A和B,让A以两步的频率往前移动,B以一步的频率往前移动,如果这个链表中存在环,那么一定有某个时刻A和B会在圈里相遇。如果没有环,A最终会指向空指针遍历完毕。

你可以简单理解为A跑得快B跑得慢,如果有环,A只能在里面转圈和B碰面,没环A就能跑完。

142.环形链表2

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果这个链表有环,是否能求出环的起点?

解法的前部分和刚刚一样:创建两个指针,慢指针以一步的频率向前移动,快指针的频率为两步,最终他们会在圈内相遇。

相遇之后将其中一个指针移动到链表头,再让他们同时以一步的频率往前移动,他们就会在环的起始点相遇,返回指针位置完成题目。

16be4458f1460c5a9282e2965ce7c0d3.png
图源网络,侵删

equation?tex=x%EF%BC%8Cy%EF%BC%8Cz 如图所示,假设两指针相遇时,当前快指针走的路程为
equation?tex=S1 ,慢指针走的路程为
equation?tex=S2 ,有:
  • equation?tex=S1%3Dx%2By%2Bz%2By
  • equation?tex=S2%3Dx%2By

其中

equation?tex=S1 中的
equation?tex=z 可以比图中画的路程
多整数倍环的路程,由于多走的是整圈,所以并不影响位置。

因为快指针比慢指针走的频率快一倍,路程也多一倍

  • equation?tex=S1%3D2S2%3D2x%2B2y
  • equation?tex=S1%3Dx%2By%2Bz%2By%3D2x%2B2y
  • equation?tex=x%3Dz

意味着从链表头到环起始点的距离等于相遇点到环起始点的距离(加上整数倍环的路程)

所以当一个指针在相遇点,另一个在起点,并且以一步为频率同时向前移动时,就会在环起始点相遇。

160.相交链表

编写一个程序,找到两个单链表相交的起始节点。

如果有两个链表串在了一起应该如何判断?

164da46f656ae19e4d58d5a0dee470d3.png
图源leetcode

解法是:

  1. 创建两个指针
    equation?tex=x%EF%BC%8Cy ,分别在
    equation?tex=A%EF%BC%8CB 的头部
  2. 都以一步的频率同时向前移动。
  3. 如果其中一个指针遍历完一条链表,就马上跳转到另一个链表的头部进行遍历
    (例如
    equation?tex=x 遍历完链表
    equation?tex=A ,马上从头去遍历链表
    equation?tex=B ,另一个也是如此)。
  4. 两个指针在遍历过程中相遇,则两个链表相交,没有相遇则链表没有相交。

先来看没有相交的情况

06e0b10d65eb58e00c91481ced025a33.png

假设指针

equation?tex=x 在这两次遍历的总路程为
equation?tex=S1
equation?tex=y
equation?tex=S2
  • equation?tex=S1%3Da%2Bb
  • equation?tex=S2%3Db%2Ba

df54b357417e117642ac852bee3e621f.png

当两条链表有相交时,两个指针所走过的路程:

  • equation?tex=S1%3Da%2Bc%2Bb%2Bc
  • equation?tex=S2%3Db%2Bc%2Ba%2Bc

可以看到当指针

equation?tex=x 走了
equation?tex=a%2Bc%2Bb ​时,指针
equation?tex=y 刚也好走了​
equation?tex=b%2Bc%2Ba ,和指针
equation?tex=x 一样
停在了两个链表的相交处。所以两个指针如果相遇,两个链表就有相交。

以上题目均转载自

力扣​leetcode-cn.com 顾不问:算法入门笔记-目录​zhuanlan.zhihu.com
zhihu-card-default.svg
github​github.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值