86. 分隔链表
难度中等279
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
思路分析:
建立两个头节点beforeHead,afterHead,分别用来保存val比x小的节点,和大于等于val的节点。
然后通过head链表,比x小就放在before后面,即before.next=head;反之,放在after后面,即after.next=head
往前走,直到head=null
之后,before.next=afterHead.next 把两个链表接一下, 最后 after.next=null 防止出现循环。
总体来讲只申请了beforeHead afterHead两个空间,所以空间复杂度为O(1),时间复杂度为O(n)。
AC代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode beforeHead=new ListNode(0);
ListNode before=beforeHead;
ListNode afterHead=new ListNode(0);
ListNode after=afterHead;
while(head!=null)
{
if(head.val<x)
{
before.next=head;
before=before.next;
}
else
{
after.next=head;
after=after.next;
}
head=head.next;
}
before.next=afterHead.next;
after.next=null;
return beforeHead.next;
}
}
再提一点:
本来第一想法是采用一遍的快速排序的,但是很明显需要改变链表的数据结构,形成双向链表,耗费会比较多,因而放弃了,但是不失为一种可行的方法。
快排思想的话可以参考一下这篇博客。