题目
给你一个链表的头节点 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
思路
声明2个小链表,一个small,一个big,所有<x的节点链接在small,所有>=x的节点链接在big,合并small和big。拼接链表,不新建。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
//创建small和big两个小链表的头节点
ListNode smallHead = new ListNode(-1);
ListNode bigHead = new ListNode(-1);
//按照升序插入,因此需要尾插。分别指向两个子链表的尾部
ListNode smallTail = smallHead;
ListNode bigTail = bigHead;
//边遍历原链表,边根据值将节点依次放在两个子链表中
while(head != null) {
if(head.val < x) {
//放在small链表中
smallTail.next = head;
smallTail = head;
} else {
//此时head.val >= x,放在big链表中
bigTail.next = head;
bigTail = head;
}
head = head.next;
}
//将bigTail尾部元素置为null
bigTail.next = null;
//拼接小链表和大链表
smallTail.next = bigHead.next;
return smallHead.next;
}
}
给定一个链表和特定值x,将所有小于x的节点放在大于或等于x的节点之前,过程中不保留初始相对位置,最后合并两个部分。
392

被折叠的 条评论
为什么被折叠?



