/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode partition(ListNode head, int x) {
ListNode left=new ListNode(-1), right=new ListNode(-1);
ListNode cur = head, left_head = null, right_head = null;
while(cur!=null){
if(cur.val < x){
left.next = cur;
cur = cur.next;
left = left.next;
left.next = null;
if(left_head == null)
left_head = left;
}else{
right.next = cur;
cur = cur.next;
right = right.next;
right.next = null;
if(right_head == null)
right_head=right;
}
}
if(right_head!=null){
left.next = right_head;
left = left.next;
if(left_head == null) //只有右边
left_head = left;
}
return left_head;
}
}
分析:就一个链表分区,
第一个想到,分别从链表两端看往中间走,左边指针放比pivot小的,右边指针放比pivot大的。
1)如果左边遇到大的,右边遇到小的:左右调换;
2)如果左边遇到大的,右边遇到大的:左边插入右边;
3)如果左边遇到小的,右边遇到小的:右边插入左边;
直到左指针遇到右指针。
因为是链表结构,交换/插入的实现都是很繁琐。舍弃!
第二个想法是链表从左往右走,当遇到小的放到左指针后面,当遇到大的放到右指针后面。最后将左指针连接右指针。
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
.