面试题 02.04:分割链表

简介: 面试题 02.04:分割链表

题目

题目链接

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

解题

方法一:创建新的链表

创建两个链表,其中一个值小于x,另外一个大于x

最后再将两者进行合并。

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode* dummy1=new ListNode(0);
        ListNode* p1=dummy1;
        ListNode* dummy2=new ListNode(0);
        ListNode* p2=dummy2;
        ListNode* cur=head;
        while(cur){
            if(cur->val<x){
                p1->next=cur;
                p1=p1->next;
            }
            else{
                p2->next=cur;
                p2=p2->next;
            }
            cur=cur->next;
        }
        p2->next = nullptr;//必须要加,因为p2接的是cur,而cur可能不只就一个节点
        p1->next=dummy2->next;
        return dummy1->next;
    }
};

方法二:双指针(原地修改)

参考链接

慢指针:修改值,变成小于x的

块指针:遇到小于x的,就和慢指针交换

交换节点,无须节点进行交换,只需要值进行交换就行了

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode* slow=head;
        ListNode* fast=head;
        while(fast){
            if(fast->val<x){
                swap(slow->val,fast->val);
                slow=slow->next;
            }
            fast=fast->next;
        }
        return head;
    }
};

相关文章
|
9月前
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
157 1
|
存储 算法 安全
HashMap常见面试题(超全面):实现原理、扩容机制、链表何时升级为红黑树、死循环
HashMap常见面试题:红黑树、散列表,HashMap实现原理、扩容机制,HashMap的jd1.7与jdk1.8有什么区别,寻址算法、链表何时升级为红黑树、死循环
|
存储 算法 Python
【面试题】合井K个升序链表
【面试题】合井K个升序链表
135 0
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。
|
存储 算法 索引
链表面试题
链表面试题
124 0
链表面试题
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
【一刷《剑指Offer》】面试题 16:反转链表
【一刷《剑指Offer》】面试题 16:反转链表