86. 分隔链表

246 阅读1分钟

题目描述

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

你应当 保留 两个分区中每个节点的初始相对位置。

分析

输入:链表头节点 head 输出:变换后的链表头节点

解题思路

题目要求我们重新对链表排序,根据是节点值是否小于 x,然后还要返回这个新的链表。

那我们肯定要把链表分成左右两部分,然后再把他们链接 🔗 到一起,再返回头节点就行了。

那我们开始操作:

我们举个例子 🌰,x = 3

image.png

我们创建两个 dummyHead,分别为 smalllarge,表示小于和大于等于 x 的节点组成的链表。

这里选用 dummyHead 的原因是要方便处理为空的情况,我们链接 🔗 两个链表的时候,只要通过 .next 的方式就可以了。不用考虑是否变量为空。

这里面需要注意的一点就是,我们 large 的部分的最后一个节点,如果取的是链表中间的某个节点,那么他的 next 实际上是指向另一个节点的,这是不正确的,所以要把它指向 null

我们来看代码。

代码

var partition = function (head, x) {
        let small = new ListNode(0);
        const smallHead = small;
        let large = new ListNode(0);
        const largeHead = large;

        while (head !== null) {
          if (head.val < x) {
            small.next = head;
            small = small.next;
          } else {
            large.next = head;
            large = large.next;
          }
          head = head.next;
        }

        large.next = null;
        small.next = largeHead.next;

        return smallHead.next;
      };

复杂度

时间:O(N), 遍历了一遍链表
空间:O(N), 需要存储几个指针