【Leetcode】86.分割链表

86 分割链表

题目:
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

思路:

  • 建立两个链表min和max,分别收集小于x的元素和大于等于x的元素。头结点分别设为两个哑节点minhead和maxhead,也就是说实际的第一个节点为哑节点的next。
  • 遍历原有链表的每一个元素,若元素值小于x,则放入min链表中,若元素值大于等于x,则放入max链表中。
  • 遍历完所有元素之后,将min链表和max链表连接,max的最后指向null,min的最后指向max的开头,即maxhead.next

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public ListNode partition(ListNode head, int x) {
ListNode minhead = new ListNode(0);
ListNode mincur = minhead;
ListNode maxhead = new ListNode(0);
ListNode maxcur = maxhead;
ListNode cur = head;
while(cur != null){
if(cur.val < x){
mincur.next = cur;
mincur = mincur.next;
}
else{
maxcur.next = cur;
maxcur = maxcur.next;
}
cur = cur.next;
}
maxcur.next = null;
mincur.next = maxhead.next;
return minhead.next;
}

时间复杂度:O(n)
空间复杂度:O(1)