leetcode 86. 分隔链表

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

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

题目比较友好,因为需要保证原来的相对位置,所以不需要考虑排序,比快排简单一些。所以采用两个节点,分别记录>=x的和<x的数据,为了减少判断,可以每个节点设置一个虚拟节点。最后把两个节点相连,并把>=x的最后一个节点的next设置为null。

    public ListNode partition(ListNode head, int x) {
        ListNode a1 = new ListNode(0);
        ListNode a2 = a1;
        ListNode b1 = new ListNode(0);
        ListNode b2 = b1;
        while (head != null) {
            if (head.val >= x) {
                b1.next = head;
                b1 = b1.next;
            } else {
                a1.next = head;
                a1 = a1.next;
            }
            head = head.next;
        }
        b1.next = null;
        a1.next = b2.next;
        return a2.next;
    }

posted @ 2021-04-21 09:55  旺仔古李  阅读(26)  评论(0编辑  收藏  举报