给你一个链表的头节点 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
题解(双指针+链表合并)
- 两个虚拟头结点bigDummyHead smallDummyHead两个尾节点bigTail smallTail
,分成用来存储小于x的结点和大于x的结点- 如果head.val<x smallDummyHead.next=head head+= smallTail++
- 如果head.val>x bigDummyHead.next=head head++ small++
- 当head==null 则将将存储小于x的链表链接到大于x的链表后
public ListNode partition(ListNode head, int x) { if (head==null){ return head; }//如果空链表,直接返回head ListNode bigDummyHead=new ListNode();//存储大于x结点的虚拟头结点 ListNode smallDummyHead=new ListNode();//存储小于x结点的虚拟头结点 ListNode bigTail=bigDummyHead;//存储大于x结点的尾结点 ListNode smallTail=smallDummyHead;//存储小于于x结点的尾结点 while (head!=null){ if (head.val>=x){//大于x,就接到bigTail后面 bigTail.next=head; bigTail=bigTail.next; }else {//小于x,就接到smallTail后面 smallTail.next=head; smallTail=smallTail.next; } ListNode node=head;//因为后面接着该节点及以后的结点需要断开 head=head.next; node.next=null; } smallTail.next=bigDummyHead.next;//将存储大于等于x的结点的链表接到存储小于x的结点的链表之后 return smallDummyHead.next; }