86. Partition List
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given 1->4->3->2->5->2
and x = 3,
return 1->2->2->4->3->5
.
思路:此题的任务是划分链表,比x小的链表节点都出现在比x大或者等于的节点前面,而且还要保持原来的相对位置不要发生变化。我们新建两个链表了l1,l2,遍历原来的链表 ,把值小于x的节点都加入l1,把值大于或者等于x的节点都加入l2,最后将l2连接至l1的后面,所得的链表就是我们所求的结果了。
注意点就是最后将第二个链表末尾置空,不然形成环
类似计数排序的思想
原始版,未使用伪结点
/**
* 思路是将list按X分成两段
* 小于的连接p
* 大于的连接q
* 最后合并p和q即可
*/
public ListNode partition(ListNode head, int x) {
if (head == null)
return head;
ListNode p = null;
ListNode headP = null;
ListNode q = null;
ListNode headQ = null;
while (head != null) {
if (head.val < x) {
if (p == null) {
p = head;
headP = p;
} else {
p.next = head;
p = p.next;
}
} else {
if (q == null) {
q = head;
headQ = q;
} else {
q.next = head;
q = q.next;
}
}
head = head.next;
}
if (q != null)
q.next = null;
if (p == null)
return headQ;
p.next = headQ;
return headP;
}
改进:
public ListNode partition1(ListNode head, int x) {
// 头结点
ListNode dummy1 = new ListNode(0);
ListNode dummy2 = new ListNode(0);
// 当前结点
ListNode curr1 = dummy1;
ListNode curr2 = dummy2;
while (head != null) {
if (head.val < x) {
curr1.next = head;
curr1 = head;
} else {
curr2.next = head;
curr2 = head;
}
head = head.next;
}
// important! avoid cycle in linked list.
// otherwise u will get TLE.
curr2.next = null;
curr1.next = dummy2.next;
return dummy1.next;
}
.