分隔链表
难度:
标签:
题目描述
给你一个链表的头节点 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
代码结果
运行时间: 44 ms, 内存: 15 MB
// Java Stream Solution
// 注意:Java的Stream不适用于链表操作,因此此方法使用常规Java代码。
// 思路:与普通Java解法相同,无法使用Stream进行链表操作。
class ListNode {
int val;
ListNode next;
ListNode(int val) { this.val = val; }
}
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode smallerHead = new ListNode(0);
ListNode greaterHead = new ListNode(0);
ListNode smaller = smallerHead, greater = greaterHead;
while (head != null) {
if (head.val < x) {
smaller.next = head;
smaller = smaller.next;
} else {
greater.next = head;
greater = greater.next;
}
head = head.next;
}
greater.next = null;
smaller.next = greaterHead.next;
return smallerHead.next;
}
}
解释
方法:
该题解的思路是将原链表拆分为两个子链表,一个存储所有小于x的节点,一个存储所有大于等于x的节点。创建两个虚拟头节点dummy1和dummy2,分别指向两个子链表。遍历原链表,将每个节点按值的大小关系插入到对应的子链表末尾。最后,将大于等于x的子链表接到小于x的子链表的末尾,并返回小于x子链表的头节点。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在题解中,如果链表已经是空,直接返回head合适吗?这是否意味着应该有一个特殊处理或返回值以区分空链表和处理后的链表相同的情况?
▷🦆
为什么在连接两个子链表之前,需要将大于等于x的子链表的末尾指向None,这一步具体是为了解决什么问题?
▷🦆
你是如何确保在将小于x的节点和大于等于x的节点分开时,他们的相对顺序保持不变的?
▷🦆
题解中提到将大于等于x的子链表接到小于x的子链表末尾,这种操作是否可能导致原链表中的循环引用?如果是,应该如何避免?
▷