题目描述:
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
第一种解法:新建节点,判断后根据位置来进行
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode pre = new ListNode(-1);
ListNode last = new ListNode(-1);
ListNode tempre = pre;
ListNode temlast = last;
while (head != null) {
if(head.val >= x){
ListNode tem = new ListNode(head.val);
temlast.next = tem;
temlast = tem;
}else {
ListNode tem = new ListNode(head.val);
tempre.next = tem;
tempre = tem;
}
head = head.next;
}
last = last.next;
while (last != null) {
tempre.next = last;
tempre = last;
last = last.next;
}
return pre.next;
}
}
第二种解法,根据值直接连接,这样空间复杂度极大降低
代码:需要注意的是每次都需要将.next置为null,防止next出现循环的情况导致内存溢出
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode pre = new ListNode(-1);
ListNode last = new ListNode(-1);
ListNode tempre = pre;
ListNode temlast = last;
while (head != null) {
if(head.val >= x){
temlast.next = head;
head = head.next;
temlast = temlast.next;
temlast.next = null;
}else {
tempre.next = head;
head = head.next;
tempre = tempre.next;
tempre.next = null;
}
}
tempre.next = last.next;
return pre.next;
}
}