希望通过博客和大家相互交流,相互学习,如有错误,请评论区指正
给你一个链表的头节点 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
解题思路
分割链表,我们可以用两个链表来管理结点,用list1管理val小于x的结点,list2管理val大于等于x的结点,将整个链表遍历一遍就可以得到list1和list2,然后将list1和list2拼接起来便得到了结果
class Solution {
public ListNode partition(ListNode head, int x) {
if (head == null) {
return null;
}
// 用两个链表来管理,一个链表管小于x的,另一个管大于或等于x的
ListNode list1 = null;
ListNode list2 = null;
ListNode lastNode1 = null;
ListNode lastNode2 = null;
ListNode cur = head;
while (cur != null) {
if (cur.val < x) {
// list1尾插
if (lastNode1 == null) {
list1 = cur;
} else {
lastNode1.next = cur;
}
lastNode1 = cur;
} else {
// list2尾插
if (lastNode2 == null) {
list2 = cur;
} else {
lastNode2.next = cur;
}
lastNode2 = cur;
}
cur = cur.next;
}
if (lastNode1 == null) {
return list2; // 链表中结点的val值全部大于等于x
}
if (lastNode2 == null) {
return list1; // 链表中结点的val值全部小于x
}
lastNode1.next = list2; // 将两个链表做拼接
lastNode2.next = null;
return list1;
}
}
复杂度分析
时间复杂度:O(N),需要将原链表遍历一便,N为原链表长度
空间复杂度:O(1)
欢迎大家关注!!!
一起学习交流 !!!
让我们将编程进行到底!!!
--------------整理不易,请三连支持------------------