Technical Interview Question:
Write a function to partition a linked list around a given value x, such that all nodes with values less than x come before all nodes with values greater than or equal to x. In other words, re-arrange the nodes so that all nodes less than x appear before all nodes greater than or equal to x, while preserving the original relative order of the nodes within each group.
You are given the definition of a singly linked list node:
class ListNode {
public int val;
public ListNode next;
ListNode(int val) {
this.val = val;
}
}
Write a function partition that takes in the head of the linked list and an integer x, and returns the head of the modified linked list.
Example:
Input: 1 -> 4 -> 3 -> 2 -> 5 -> 2, x = 3
Output: 1 -> 2 -> 2 -> 4 -> 3 -> 5
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public class Solution {
public ListNode partition(ListNode head, int x) {
ListNode dummy1 = new ListNode(0);
ListNode dummy2 = new ListNode(0);
ListNode curr1 = dummy1;
ListNode curr2 = dummy2;
ListNode curr = head;
while (curr != null) {
if (curr.val < x) {
curr1.next = curr;
curr1 = curr;
} else {
curr2.next = curr;
curr2 = curr;
}
curr = curr.next;
}
curr2.next = null; // set end of greater/equal list to null
curr1.next = dummy2.next; // connect end of less list to greater/equal list's head
return dummy1.next;
}
}
Explanation:
dummy1 and dummy2 to represent two partitions: one for nodes less than x, and the other for nodes greater than or equal to x.x. If it is, we append it to the first partition (dummy1), else we append it to the second partition (dummy2).dummy2) to null to disconnect it from the original list, and connect the end of the first partition to the head of the second partition.x.