LeetCode笔记汇总
题目
给你一个链表的头节点 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]
思路
本题没有限制不能使用额外的存储空间,因此我们可以定义两个链表left和right,分别存储原链表中小于x的和大于等于x的节点。同时为两个链表定义两个虚拟头节点L和R。通过循环遍历原链表,将原链表中的每个节点都放到left或right链表中。
当我们遍历结束时,只需要将left的最后一个节点(即为left)的next指向right的第一个节点(即R.next)。同时将right的最后一个节点的next置空。
最后返回left的头节点L.next
代码
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode left = new ListNode(0);
ListNode L = left;
ListNode right = new ListNode(0);
ListNode R = right;
while(head != null){
if(head.val >= x){
right.next = head;
right = right.next;
}else{
left.next = head;
left = left.next;
}
head = head.next;
}
left.next = R.next;
right.next = null;
return L.next;
}
}