Tag:List
Difficulty:Medium
Problem
分隔链表
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
Input: head = [1,4,3,2,5,2], x = 3 Output: [1,2,2,4,3,5]
Solution
定义了两个节点,分别保存小于和大于等于。注意最后合并时判断是否为空。
整体来看比较简单,归根到底是链表插入
public ListNode partition(ListNode head, int x) {
if (head == null || head.next == null) {
return head;
}
ListNode smaller = new ListNode(-1), spre = smaller;
ListNode equalBig = new ListNode(-1), epre = equalBig;
ListNode cur = head;
while (cur != null) {
ListNode tmp = cur.next;
cur.next = null;
if (cur.val < x) {
// 串到smaller
spre.next = cur;
spre = spre.next;
} else {
epre.next = cur;
epre = epre.next;
}
cur = tmp;
}
// 注意可能为空
if (spre == smaller) {
// 小于为空 返回大于等于即可
return equalBig.next;
} else {
spre.next = equalBig.next;
return smaller.next;
}
}