链表划分

链表划分

问题

这个题目说的是,给你一个单链表和一个数字,你要把小于这个数字的节点都移到链表前面,大于等于这个数字的节点都移到链表后面。并且在较小和较大的这两堆节点中,节点之间的相对顺序保持不变。

比如说,给你的单链表是:

0 -> 4 -> 2 -> 1 -> 8 -> 1

给你的数字是 2。小于 2 的节点有 0/1/1 共 3 个,大于等于 2 的节点有 4/2/8 共 3 个。因此重新划分后得到的链表是:

0 -> 1 -> 1 -> 4 -> 2 -> 8

可以看到,较小的那一堆 0/1/1 三个节点保持了在原链表中的相对顺序,较大的那一堆 4/2/8 三个节点也保持了在原链表中的相对顺序。

代码

public class AlgoCasts {

  public class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
      val = x;
    }
  }

  // Time: O(n), Space: O(1)
  public ListNode partitionAndPreserveOrder(ListNode head, int x) {
    if (head == null) return null;
    ListNode smaller = new ListNode(0), greater = new ListNode(0);
    ListNode ps = smaller, pg = greater;
    for (ListNode p = head; p != null; p = p.next) {
      if (p.val < x) {
        ps.next = p;
        ps = ps.next;
      } else {
        pg.next = p;
        pg = pg.next;
      }
    }
    ps.next = greater.next;
    pg.next = null;
    return smaller.next;
  }

}

  转载请注明: ForwardXu 链表划分

 上一篇
不用+-求两数之和 不用+-求两数之和
不用+/-求两数之和问题 这个题目说的是,给你两个整数,在不使用 +/- 这两个运算符的前提下,求它们的和。 代码 public class AlgoCasts { public int getSumRecursive(int a,
2018-12-16
下一篇 
合并两个有序链表 合并两个有序链表
合并两个有序链表问题 这个题目说的是,给你两个递增排序的链表,你要把它们合成一个链表,并且保持递增排序。另外要求,新链表上的节点使用的就是旧的两个链表上的节点,不能创建新节点。 比如说,给你的两个链表 L1 和 L2,分别是: L1: 1
2018-12-12
  目录