Problem:
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.
Example:
Input: head = 1->4->3->2->5->2, x = 3 Output: 1->2->2->4->3->5
Analysis:
本题的思路是用两个新的链表分别保存小于和不小于值x的所有节点,同时保证两个链表中的位置元素的相对位置分别没有发生改变。然后再讲两个链表组装起来。代码如下:
Code:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
// check head if null
if(head == null)
return head;
ListNode s1 = new ListNode(-1);
ListNode b1 = new ListNode(-1);
ListNode p = head, p1 = s1, p2 = b1;
while(p != null) {
if(p.val < x) {
ListNode temp = new ListNode(p.val);
p1.next = temp;
p1 = p1.next;
} else {
ListNode temp = new ListNode(p.val);
p2.next = temp;
p2 = p2.next;
}
p = p.next;
}
p1.next = b1.next;
return s1.next;
}
}