冲击大厂算法面试=>链表专题【链表简单分割】

目录标题

分隔链表【一分为二】

感觉会又有点不会!!!😢

上代码

java 复制代码
class Solution {
    /**
     * 一个链表的分区算法,该算法根据给定值 x 将链表分为两部分:一部分包含所有小于 x 的节点,另一部分包含所有大于等于 x 的节点。最终,这两部分链表被连接在一起返回
     */
    public ListNode partition(ListNode head, int x) {
        //使用虚拟头结点:使边界条件更简单,避免在处理链表头节点时的额外检查
        //preHead:作为原始链表的头结点的前驱,便于操作原链表
        ListNode preHead = new ListNode(-1);
        preHead.next = head;

        //使用 cur 遍历原链表,从 head 开始直到链表末尾
        ListNode cur = preHead;

        //双链表构造:分别构造两个链表,最后再合并,避免了在原链表上直接修改带来的复杂性
        //leftPreNode 和 rightPreNode:分别用于构建小于 x 和大于等于 x 的新链表的头结点前驱
        ListNode leftPreNode = new ListNode(-10);
        ListNode leftNode = leftPreNode;

        ListNode rightPreNode = new ListNode(-10);
        ListNode rightNode = rightPreNode;

        while (cur.next != null) {
            //节点复制:为避免改变原链表,创建了新节点进行操作,虽然牺牲了一些空间效率,但简化了逻辑
            if (cur.next.val < x) {
                leftNode.next = new ListNode(cur.next.val);
                leftNode = leftNode.next;
            } else {
                rightNode.next = new ListNode(cur.next.val);
                rightNode = rightNode.next;
            }
            cur = cur.next;
        }
        //完成遍历后,将左侧链表的尾部指向右侧链表的头部(即 rightPreNode.next),形成完整的分区后的链表
        leftNode.next = rightPreNode.next;
        //将右侧链表的尾部指向 null,确保链表正确终止。
        rightNode.next = null;

        //head没变=1->4->3->2->5->2
        //返回左侧链表的头结点(即 leftPreNode.next),因为整个分区后的链表是以左侧链表开始
        return leftPreNode.next;
    }
}

题解呀

比较简单,就是把一个链表一分为二,然后再连接

空间优化?

直接将new ListNode(cur.next.val) 改成 cur.next 就行

java 复制代码
while (cur.next != null) {
   if (cur.next.val < x) {
        leftNode.next = cur.next;
        leftNode = leftNode.next;
    } else {
        rightNode.next = cur.next;
        rightNode = rightNode.next;
    }
    cur = cur.next;
}

实在不会的时候记住

  • "小前":把小于分区值的节点放在链表的前面(less链表)。
  • "大后":把大于等于分区值的节点放在链表的后面(greater链表)。
  • "链条分开":分别处理less链表和greater链表。
  • "尾接中间":将less链表的尾部连接到greater链表的头部。
  • "结尾'无'配":确保greater链表的尾部指向null,链表结束。

有用的话就点个赞再走吧!

相关推荐
SilentSamsara几秒前
模型可解释性业务化:SHAP/LIME 的业务汇报与合规审查
人工智能·算法·机器学习·自动化
byte轻骑兵7 分钟前
【LE Audio】CSIP精讲[5]: 蓝牙协同设备组的安全防护体系与实战规范
算法·安全·音频·le audio·低功耗音频
剑挑星河月8 分钟前
35.搜索插入位置
java·数据结构·算法·leetcode
闪电悠米19 分钟前
力扣hot100-438.找到字符串中所有字母异位词-固定长度滑动窗口详解
linux·服务器·数据结构·算法·leetcode·滑动窗口·力扣hot100
人道领域26 分钟前
【LeetCode刷题日记】51.N皇后
数据结构·算法
芝士爱知识a9 小时前
AI 模拟面试怎么做:智蛙公考智能体多轮对话 + 实时追问的工程实现
面试·职场和发展
古城小栈9 小时前
为啥说:训练用BF16,推理用FP16
人工智能·算法·机器学习
KaMeidebaby9 小时前
卡梅德生物技术快报|蛋白 N 端测序在重组贻贝融合蛋白表征中的应用,解决原核表达序列偏移工艺难题
前端·人工智能·物联网·算法·百度
帅次10 小时前
Android 高级工程师面试:Java 基础知识 近1年高频追问 22 题
android·java·面试
Turbo正则10 小时前
群论在AI中的应用概述
人工智能·算法·抽象代数