面试题:分割链表

188 阅读1分钟

面试题:分割链表

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

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

 

示例 1:

plum.jpg

输入: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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pa… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

我们可以创建两个链表,用来存放大于或等于x的节点,以及小于x的节点,并且创建两个节点指向这两个链表的头部

    let small = new ListNode(-1),
        sm = small,
        big = new ListNode(1),
        bg = big;

然后遍历传进来的head,判断head的链表,小于x的节点存放在small中,sm移动,令sm保持一直指向small的尾节点,big和bg同理

    while (head) {
        if (head.val < x) {
            sm.next = head;
            sm = head;
        } else {
            bg.next = head;
            bg = head;
        }
        head = head.next;
    }

最后把他们的尾节点的next都设为null,然后连上,输出即可

    sm.next = null;
    bg.next = null;
    sm.next = big.next;
    return small.next;

完整代码


var partition = function (head, x) {
    if (!head) return head;
    let small = new ListNode(-1),
        sm = small,
        big = new ListNode(1),
        bg = big;
    while (head) {
        if (head.val < x) {
            sm.next = head;
            sm = head;
        } else {
            bg.next = head;
            bg = head;
        }
        head = head.next;
    }
    sm.next = null;
    bg.next = null;
    sm.next = big.next;
    return small.next;
};