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; }