题目介绍
给你一个链表的头节点 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 <= 200leetcode-86 分隔链表
面试题 02.04. 分割链表
b站视频
解题思路
本题要求将大于等于 x 的链表节点和小于 x 的链表节点分开,并且将小于 x 的链表节点放置到大于等于 x 的链表节点前面
可以先根据节点值与 x 的大小关系,将原链表分割成大小两个链表,一个链表里面的节点全部小于 x,一个链表里面的节点全部大于等于 x
然后只需要将小于 x 的链表的尾节点的 next 指针指向大于等于 x 的链表的头节点,然后返回小于 x 的链表的头节点即可
解题代码
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
};