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
.
Analysis:
The first element that is not less than x is the point of partition. We record this node and its predecessor. Once we encount a node that is less than x later, we insert it between the point and its predecessor, then update the predecssor to this node.
Solution:
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { 7 * val = x; 8 * next = null; 9 * } 10 * } 11 */ 12 public class Solution { 13 public ListNode partition(ListNode head, int x) { 14 if (head==null || head.next==null) return head; 15 16 ListNode preHead = new ListNode(0); 17 preHead.next = head; 18 ListNode end = preHead; 19 ListNode cur = head; 20 21 while (cur!=null && cur.val<x){ 22 end = cur; 23 cur = cur.next; 24 } 25 26 while (cur!=null && cur.next!=null){ 27 if (cur.next.val>=x){ 28 cur = cur.next; 29 } else { 30 ListNode temp = cur.next; 31 cur.next = temp.next; 32 temp.next = end.next; 33 end.next = temp; 34 end = temp; 35 } 36 } 37 38 return preHead.next; 39 } 40 }