这道题的思路是先初始化两个list,然后遍历原来的list,发现小于x的分到小的list,反之分到大的list,然后将两个list merge一下,注意头和尾,时间复杂度O(n),空间复杂度O(n),代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode partition(ListNode head, int x) {
if(head == null){
return head;
}
// Create dummy nodes
ListNode leftDummy = new ListNode(0);
ListNode rightDummy = new ListNode(0);
// Initialize pointers
ListNode left = leftDummy;
ListNode right = rightDummy;
while(head != null){
// Add nodes to leftDummy and rightDummy
if(head.val < x){
left.next = head;
left = head;
}else{
right.next = head;
right = head;
}
head = head.next;
}
// Merge two lists
right.next = null;
left.next = rightDummy.next;
return leftDummy.next;
}
}
知识点:
1. dummyNode的使用,在Linked List或者树的结构当中,如果头节点或者是root要变化,那么最好使用dummyNode,令dummyNode.next = head/root,返回的时候只要返回dummyNode.next即可,这样可以避免对头节点操作的麻烦
2. 在处理Linked List的问题的时候,除了two pointers的思路,如果在原来的list上面操作很不方便,那么可以采用多个list进行,最后对这些list进行操作
3. 这道题目的代码写得很优雅,可以记录一下