[路飞]_程序员必刷力扣题: 面试题 02.04. 分割链表

123 阅读2分钟

面试题 02.04. 分割链表

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

提示:

  • 链表中节点的数目在范围 [0, 200] 内
  • -100 <= Node.val <= 100
  • -200 <= x <= 200

维护两个链表

思路

兄弟们大家好,这道题目其实就是让我们把链表重排一下,按照一个中间值来区分小的部分和大的部分

这里我们直接维护两个链表不就完事了,开搞开搞

我们直接new两个拥有虚拟头结点的链表left和right,表示链表的左半部分和右半部分

然后声明两个指针来分别指向left和right的末尾结点,方便衔接节点

准备就绪,开始干(遍历),处理每一个节点:

  • 当前节点(的值,好家伙,可别用节点去比较,会err)小于x,那么久拼接在left链表上,更新min指针的位置
  • 当前节点(的值)大于等于x,那么久拼接在right链表上,更新max指针的位置

处理完毕大功告。。。(还差最后一步别急啊)

两个链表要接起来啊

直接想法当然就是left链表的末尾指针直接接在right链表头结点上(大聪明,真有你的)

只不过我们是不是要考虑一下:

right链表的max(末尾)节点是否指向空了(null)呢?当然不一定喽!

  • right链表如果正常有值衔接上去,那么很可能是原链表的中间节点,这时候要处理一下max的next指针指向null
  • right链表如果一个节点呢,那不就是空吗,不用处理了,真好

所以我们就要判断一下max有值就处理一下

这不就得到了我们心心念念的答案了吗 嘿嘿嘿!

var partition = function(head, x) {
    var left = new ListNode('left')
    var min = left
    var right = new ListNode('right')
    var max = right
   
    while(head){
        if(head.val<x) {
            min.next = head
            min = head
        }else {
            max.next = head
            max = head
        }
        head=head.next
    }
    min.next = right.next
    if(max) max.next = null

    return left.next
};