问题:
给定一个链表的头节点 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
解答思路:
要实现该题,我们可以定义两个新的链表:一个链表用来存放小于 x 的节点,另一个链表用来存放大于等于 x 的节点。然后将两个链表连接起来,注意保持小于 x 的节点的相对顺序。
具体步骤如下:
1. 创建两个新的链表:smallerHead 和 greaterHead,用于存放小于 x 和大于等于 x 的节点。
2. 遍历原链表,将小于 x 的节点连接到 smallerHead 链表中,将大于等于 x 的节点连接到 greaterHead 链表中。
3. 将 greaterHead 的链表连接到 smallerHead 的尾部,形成最终的链表。
4. 注意处理边界情况,如链表为空或只有一个节点。
以下是代码实现:
public ListNode partition(ListNode head, int x) {
ListNode smallerHead = new ListNode(0); // 存放小于 x 的节点
ListNode greaterHead = new ListNode(0); // 存放大于等于 x 的节点
ListNode smaller = smallerHead; // smaller 指向 smallerHead
ListNode greater = greaterHead; // greater 指向 greaterHead
ListNode curr = head; // 遍历原链表的指针
while (curr != null) {
if (curr.val < x) {
smaller.next = curr; // 将当前节点连接到 smaller 链表
smaller = smaller.next; // smaller 向后移动一位
} else {
greater.next = curr; // 将当前节点连接到 greater 链表
greater = greater.next; // greater 向后移动一位
}
curr = curr.next; // 当前节点向后移动一位
}
greater.next = null; // 将 greater 链表的尾部置为空
smaller.next = greaterHead.next; // 将 greater 链表连接到 smaller 链表的尾部
return smallerHead.next; // 返回最终的链表头节点
}
时间复杂度:O(n),其中 n 是链表的长度。
空间复杂度:O(1)。
(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)