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
.
Subscribe to see which companies asked this question
package leetcode86;
public class Solution {
public ListNode partition(ListNode head, int x) {
if(head==null){
return head;
}
ListNode newHead = new ListNode(-1);
ListNode newHead2 = new ListNode(-1);
ListNode r = newHead,r2=newHead2;
ListNode p = head,q;
while(p!=null){
q=p.next;
if(p.val<x){
r.next=p;
r=p;
p=q;
if(p!=null) q = q.next;
}else{
r2.next=p;
r2=p;
p=q;
if(p!=null) q=q.next;
}
}
r2.next=null;
r.next=newHead2.next;
return newHead.next;
}
public ListNode create(int[] a){
ListNode head = new ListNode(a[0]);
ListNode q = head;
for(int i=1;i<a.length;i++){
ListNode p = new ListNode(a[i]);
p.next=null;
q.next=p;
q=p;
}
return head;
}
public void show(ListNode head){
ListNode p = head;
while(p!=null){
System.out.println(p.val);
p=p.next;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = {1,4,3,2,5,2};
Solution s = new Solution();
ListNode head = s.create(a);
s.show(head);
System.out.println("*****************");
head = s.partition(head, 3);
s.show(head);
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}