备战蓝桥杯—— 双指针技巧巧答链表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

解题思路及代码

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

java 复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode middleNode(ListNode head) {
        //定义快慢指针
        ListNode first=head,slow=head;
        //判断快指针是否可以移动 快指针移动两部,慢指针移动一步,当快指针无法移动时,快指针的位置是链表的倒数第一或倒数第二节点,只需要进行判断,如果是倒数第一,直接返回慢指针,如果是倒数第二,返回慢指针的下一个节点。
        while(first.next!=null && first.next.next!=null){
            first=first.next.next;
            slow=slow.next;
        }
        if(first.next!=null){
            return slow.next;
        }
        return slow;
    }
}

结果展示

二、分隔链表

题目描述

给你一个链表的头节点 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

解题思路及代码

java 复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode dump=new ListNode(-1);
        ListNode temp=new ListNode(-1);
        ListNode result=dump;
        ListNode result1=temp;    
        //使用双指针将小于x放在第一个指针,大于等于x放在第二个指针,再将两者相接即可
        while(head!=null){
            if(head.val>=x){
                temp.next=new ListNode(head.val);
                temp=temp.next;
            }else{
                dump.next=new ListNode(head.val);
                dump=dump.next;
            }
            head=head.next;
        }
        dump.next=result1.next;
        return result.next;
    }
}

结果展示

相关推荐
玖剹16 分钟前
矩阵区域和 --- 前缀和
数据结构·c++·算法·leetcode·矩阵·动态规划·1024程序员节
zwz宝宝19 分钟前
第三次作业(密码学)
java·数据结构·算法
sxtyjty1 小时前
tarjan缩点+强联通分量
算法
freyazzr1 小时前
Leetcode刷题 | Day50_图论02_岛屿问题01_dfs两种方法+bfs一种方法
数据结构·c++·算法·leetcode·深度优先·图论·广度优先
悦悦子a啊1 小时前
C++之string
开发语言·数据结构·c++
我想进大厂1 小时前
图论---LCA(倍增法)
数据结构·c++·算法·图论
明月看潮生1 小时前
青少年编程与数学 02-018 C++数据结构与算法 16课题、贪心算法
c++·算法·青少年编程·贪心算法·编程与数学
机器学习之心1 小时前
飞蛾扑火算法优化+Transformer四模型回归打包(内含MFO-Transformer-LSTM及单独模型)
算法·回归·lstm·transformer·飞蛾扑火算法优化
阳洞洞2 小时前
leetcode 2516. 每种字符至少取 K 个
算法·leetcode·滑动窗口
菜还不练就废了3 小时前
数据结构|并查集
数据结构·算法