• 备战蓝桥杯—— 双指针技巧巧答链表4


    对于单链表相关的问题,双指针技巧是一种非常广泛且有效的解决方法。以下是一些常见问题以及使用双指针技巧解决🚀🚀:

    1. 合并两个有序链表: 使用两个指针分别指向两个链表的头部,逐一比较节点的值,将较小的节点链接到结果链表中,直至其中一个链表遍历完毕。

    2. 链表的分解: 使用快慢指针技巧,快指针每次移动两步,慢指针每次移动一步,直到快指针到达链表尾部。这样可以找到链表的中间节点,从而将链表分解成两部分。📚

    3. 合并 k 个有序链表: 可以利用归并排序的思想,两两合并链表,直到合并成一个链表。📚

    4. 寻找单链表的倒数第 k 个节点: 使用两个指针,让一个指针先移动 k 步,然后两个指针一起移动,直到第一个指针到达链表尾部,此时第二个指针指向的节点即为倒数第 k 个节点。

    5. 寻找单链表的中点: 同样使用快慢指针技巧,快指针每次移动两步,慢指针每次移动一步,直到快指针到达链表尾部,慢指针即为中点。

    6. 判断单链表是否包含环并找出环起点: 使用快慢指针技巧,如果存在环,快指针最终会追上慢指针。找到相遇点后,将其中一个指针移动到链表头部,然后两个指针以相同速度移动,再次相遇的节点即为环的起点。📚

    7. 判断两个单链表是否相交并找出交点: 分别遍历两个链表,得到它们的长度差,然后让长链表的指针先移动长度差步数,接着两个链表同时遍历,直到找到相同的节点为止。📚

    总的来说,双指针技巧在解决单链表相关问题时非常实用,它能够高效地解决许多常见问题,包括合并、分解、寻找节点、判断是否存在环等等。

    一、链表的中间节点

    题目描述

            给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

    示例 1:

    输入:head = [1,2,3,4,5]
    输出:[3,4,5]
    解释:链表只有一个中间结点,值为 3 。
    

    示例 2:

    输入:head = [1,2,3,4,5,6]
    输出:[4,5,6]
    解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。
    

    提示:

    • 链表的结点数范围是 [1, 100]
    • 1 <= Node.val <= 100

    解题思路及代码

             判断快指针是否可以移动 快指针移动两部,慢指针移动一步,当快指针无法移动时,快指针的位置是链表的倒数第一或倒数第二节点,只需要进行判断,如果是倒数第一,直接返回慢指针,如果是倒数第二,返回慢指针的下一个节点。

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode() {}
    7. * ListNode(int val) { this.val = val; }
    8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    9. * }
    10. */
    11. class Solution {
    12. public ListNode middleNode(ListNode head) {
    13. //定义快慢指针
    14. ListNode first=head,slow=head;
    15. //判断快指针是否可以移动 快指针移动两部,慢指针移动一步,当快指针无法移动时,快指针的位置是链表的倒数第一或倒数第二节点,只需要进行判断,如果是倒数第一,直接返回慢指针,如果是倒数第二,返回慢指针的下一个节点。
    16. while(first.next!=null && first.next.next!=null){
    17. first=first.next.next;
    18. slow=slow.next;
    19. }
    20. if(first.next!=null){
    21. return slow.next;
    22. }
    23. return slow;
    24. }
    25. }

    结果展示

    二、分隔链表

    题目描述

            给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。

    示例 1:

    输入:head = [1,4,3,2,5,2], x = 3
    输出:[1,2,2,4,3,5]
    

    示例 2:

    输入:head = [2,1], x = 2
    输出:[1,2]
    

    提示:

    • 链表中节点的数目在范围 [0, 200] 内
    • -100 <= Node.val <= 100
    • -200 <= x <= 200

    解题思路及代码

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode() {}
    7. * ListNode(int val) { this.val = val; }
    8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    9. * }
    10. */
    11. class Solution {
    12. public ListNode partition(ListNode head, int x) {
    13. ListNode dump=new ListNode(-1);
    14. ListNode temp=new ListNode(-1);
    15. ListNode result=dump;
    16. ListNode result1=temp;
    17. //使用双指针将小于x放在第一个指针,大于等于x放在第二个指针,再将两者相接即可
    18. while(head!=null){
    19. if(head.val>=x){
    20. temp.next=new ListNode(head.val);
    21. temp=temp.next;
    22. }else{
    23. dump.next=new ListNode(head.val);
    24. dump=dump.next;
    25. }
    26. head=head.next;
    27. }
    28. dump.next=result1.next;
    29. return result.next;
    30. }
    31. }

    结果展示

  • 相关阅读:
    智能化油田建设规划
    java网络编程Socket output is already shutdown
    MySQL导入导出&视图&索引&执行计划
    第十三届蓝桥杯JavaB组国赛H题——小球称重 (AC)
    Flutter 匠心千刃 | SHA256 加密
    外汇天眼:如何交易外汇缺口?
    vue项目问题记录 pdf.js解决跨域问题 版本v2.16.105
    JVM内存配置参数
    Mysql高阶语句
    ESP32智能小车+PS2无线遥控器+麦克纳姆轮+microPython
  • 原文地址:https://blog.csdn.net/2201_75381449/article/details/136231225