Leetcode-Partition List

LiBlog發表於2014-11-16

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 }