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

结果展示

相关推荐
秋夜Autumn18 分钟前
贪心算法相关知识
算法·贪心算法
小懒编程日记31 分钟前
【数据结构与算法】B树
java·数据结构·b树·算法
Beginner_bml35 分钟前
C语言---链表
c语言·数据结构
心怀花木38 分钟前
【算法】双指针
c++·算法
闫铁娃39 分钟前
二分解题的奇技淫巧都有哪些,你还不会吗?
c语言·数据结构·c++·算法·leetcode
Y_3_741 分钟前
【回溯数独】有效的数独(medium)& 解数独(hard)
java·数据结构·windows·算法·dfs·回溯
小码狐2 小时前
并查集【数据结构与算法】【C语言版-笔记】
数据结构·笔记·并查集·c语言版
shan_shmily2 小时前
算法知识点————贪心
算法
问道飞鱼2 小时前
每日学习一个数据结构-默克尔树(Merkle Tree)
数据结构·学习·默克尔树
寂柒2 小时前
C++——模拟实现stack和queue
开发语言·c++·算法·list