链表之双指针

双指针:

求两个链表相交的起始节点。

情况一:两个链表相交

链表 headA 和 headB 的长度分别是 m 和 n。假设链表headA的不相交部分有 a 个节点,链表 headB 的不相交部分有 b 个节点,两个链表相交的部分有 c 个节点,则有 a + c = m,b + c = n。

如果 a = b,则两个指针会同时到达两个链表相交的节点,此时返回相交的节点;

如果 a != b,则指针 pA 会遍历完链表 headA,指针 pB 会遍历完链表 headB,两个指针不会同时到达链表的尾节点,然后指针 pA 移到链表 headB 的头节点,指针 pB 移到链表 headA 的头节点,然后两个指针继续移动,在指针 pA 移动了 a+c+ba+c+b 次、指针 pB 移动了 b+c+ab+c+a 次之后,两个指针会同时到达两个链表相交的节点,该节点也是两个指针第一次同时指向的节点,此时返回相交的节点。

情况二:两个链表不相交

链表 headA 和 headB 的长度分别是 mm 和 nn。考虑当 m = n 和 m != n 时,两个指针分别会如何移动:

如果 m = n,则两个指针会同时到达两个链表的尾节点,然后同时变成空值 null,此时返回 null;

如果 m != n,则由于两个链表没有公共节点,两个指针也不会同时到达两个链表的尾节点,因此两个指针都会遍历完两个链表,在指针 pA 移动了 m + n 次、指针 pB 移动了 n + m 次之后,两个指针会同时变成空值 null,此时返回 null。

链表中倒数第K个点:

定义两个指针,想让第一个指针向前走k - 1步,然后在让两个指针同时向前移动,当第一个指针走到尾结点时,第二个指针因为和第一个指针存在k - 1的距离所以此时第二个指针就是倒数第k个结点。

扫描二维码关注公众号,回复: 15185153 查看本文章

快慢指针:

快慢指针就是存在两个指针,一个快指针,一个慢指针,两个指针每次移动的速度不一样,快的移动的快,慢的移动的慢。快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。

应用:

无法高效获取长度,无法根据偏移快速访问元素,是链表的两个劣势。然而面试的时候经常碰见诸如获取倒数第k个元素,获取中间位置的元素,判断链表是否存在环,判断环的长度等和长度与位置有关的问题。这些问题都可以通过灵活运用双指针来解决。

判断单链表是否有环:

定义两个指针,一个快指针,一个慢指针,快指针每次前进两步,慢指针每次前进一步,如果快指针追上了慢指针则说明这个链表是环形链表,如果没追上,则证明这个链表就是单链表。

PS.如果存在环,如何判断环的长度呢?方法是,快慢指针相遇后继续移动,直到第二次相遇。两次相遇间的移动次数即为环的长度。

在有序链表中寻找中位数:

定义两个指针,一个快指针,一个慢指针,因为链表为有序链表,所以我们控制快指针每次前进两步,慢指针前进一步,当快指针走到了链表的尾节点,慢指针就走到了链表的最中间了。另外此题还有一个陷阱就是:判断链表结点数量的奇偶性。如果我们的快指针移动了x次,如果达到了表尾的次数是(1 + 2x)则证明结点数量为奇数,则此时慢指针的值就是中位数。如果到达了链表的倒数第二个结点,则证明结点数量为偶数。则返回慢指针此时的值与下一个值的平均值。
 

猜你喜欢

转载自blog.csdn.net/qq_51588894/article/details/129246676