[路飞]_分割链表

172 阅读2分钟

题目介绍

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你不需要 保留 每个分区中各节点的初始相对位置。

示例1

image.png

输入: 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 的链表节点分开,并且将小于 x 的链表节点放置到大于等于 x 的链表节点前面

可以先根据节点值与 x 的大小关系,将原链表分割成大小两个链表,一个链表里面的节点全部小于 x,一个链表里面的节点全部大于等于 x

然后只需要将小于 x 的链表的尾节点的 next 指针指向大于等于 x 的链表的头节点,然后返回小于 x 的链表的头节点即可

2.gif

解题代码

var partition = function(head, x) {
    // 如果没有头节点或者链表长度为 1,不需要分割
    if (!head || !head.next) return head
    // 定义两个链表,一个存放大于等于 x 的节点,一个存放小于 x 的节点
    const gratterHead = new ListNode(-1), lessHead = new ListNode(-1)
    let p = gratterHead, q = lessHead
    while (head) {
        // 如果节点小于 x,存放到小于 x 的链表
        if (head.val < x) {
            q.next = head
            q = q.next
            q.next = null
        } else {
        // 如果节点大于等于 x,存放到大于等于 x 的链表
            p.next = head
            p = p.next
            p.next = null
        }
        head = head.next
    }
    // 将小于 x 的链表尾节点指向 大于等于 x 的链表头节点
    q.next = gratterHead.next
    // 返回小于 x 的链表头节点
    return lessHead.next
};