双指针 
      
    
      
      
      
        链表 
      
    
   
  
    
      
       
     
  
  
    
      
    
    
      
       
     
  
题目描述 
给你一个链表的头节点 head 和一个特定值  x ,请你对链表进行分隔,使得所有 小于  x 的节点都出现在 大于或等于  x 的节点之前。
你应当 保留  两个分区中每个节点的初始相对位置。
 
示例 1: 
输入: head = [1,4,3,2,5,2], x = 3
输出 :[1,2,2,4,3,5]
 
示例 2: 
输入: head = [2,1], x = 2
输出 :[1,2]
 
 
提示: 
    链表中节点的数目在范围 [0, 200] 内 
    -100 <= Node.val <= 100 
    -200 <= x <= 200 
 
解法 
方法一:模拟 
我们创建两个链表 \(l\)  和 \(r\) ,一个用来存储小于 \(x\)  的节点,另一个用来存储大于等于 \(x\)  的节点。然后我们将它们拼接起来。
时间复杂度 \(O(n)\) ,其中 \(n\)  是原链表的长度。空间复杂度 \(O(1)\) 。
Python3 Java C++ Go TypeScript Rust JavaScript C# 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 # Definition for singly-linked list. 
# class ListNode: 
#     def __init__(self, val=0, next=None): 
#         self.val = val 
#         self.next = next 
class   Solution : 
    def   partition ( self ,  head :  Optional [ ListNode ],  x :  int )  ->  Optional [ ListNode ]: 
        l  =  ListNode () 
        r  =  ListNode () 
        tl ,  tr  =  l ,  r 
        while  head : 
            if  head . val  <  x : 
                tl . next  =  head 
                tl  =  tl . next 
            else : 
                tr . next  =  head 
                tr  =  tr . next 
            head  =  head . next 
        tr . next  =  None 
        tl . next  =  r . next 
        return  l . next 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 /** 
 * Definition for singly-linked list. 
 * public class ListNode { 
 *     int val; 
 *     ListNode next; 
 *     ListNode() {} 
 *     ListNode(int val) { this.val = val; } 
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; } 
 * } 
 */ 
class  Solution   { 
     public   ListNode   partition ( ListNode   head ,   int   x )   { 
         ListNode   l   =   new   ListNode (); 
         ListNode   r   =   new   ListNode (); 
         ListNode   tl   =   l ,   tr   =   r ; 
         for   (;   head   !=   null ;   head   =   head . next )   { 
             if   ( head . val   <   x )   { 
                 tl . next   =   head ; 
                 tl   =   tl . next ; 
             }   else   { 
                 tr . next   =   head ; 
                 tr   =   tr . next ; 
             } 
         } 
         tr . next   =   null ; 
         tl . next   =   r . next ; 
         return   l . next ; 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 /** 
 * Definition for singly-linked list. 
 * struct ListNode { 
 *     int val; 
 *     ListNode *next; 
 *     ListNode() : val(0), next(nullptr) {} 
 *     ListNode(int x) : val(x), next(nullptr) {} 
 *     ListNode(int x, ListNode *next) : val(x), next(next) {} 
 * }; 
 */ 
class   Solution   { 
public : 
     ListNode *   partition ( ListNode *   head ,   int   x )   { 
         ListNode *   l   =   new   ListNode (); 
         ListNode *   r   =   new   ListNode (); 
         ListNode *   tl   =   l ; 
         ListNode *   tr   =   r ; 
         for   (;   head ;   head   =   head -> next )   { 
             if   ( head -> val   <   x )   { 
                 tl -> next   =   head ; 
                 tl   =   tl -> next ; 
             }   else   { 
                 tr -> next   =   head ; 
                 tr   =   tr -> next ; 
             } 
         } 
         tr -> next   =   nullptr ; 
         tl -> next   =   r -> next ; 
         return   l -> next ; 
     } 
}; 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 /** 
 * Definition for singly-linked list. 
 * type ListNode struct { 
 *     Val int 
 *     Next *ListNode 
 * } 
 */ 
func   partition ( head   * ListNode ,   x   int )   * ListNode   { 
     l ,   r   :=   & ListNode {},   & ListNode {} 
     tl ,   tr   :=   l ,   r 
     for   ;   head   !=   nil ;   head   =   head . Next   { 
         if   head . Val   <   x   { 
             tl . Next   =   head 
             tl   =   tl . Next 
         }   else   { 
             tr . Next   =   head 
             tr   =   tr . Next 
         } 
     } 
     tr . Next   =   nil 
     tl . Next   =   r . Next 
     return   l . Next 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 /** 
 * Definition for singly-linked list. 
 * class ListNode { 
 *     val: number 
 *     next: ListNode | null 
 *     constructor(val?: number, next?: ListNode | null) { 
 *         this.val = (val===undefined ? 0 : val) 
 *         this.next = (next===undefined ? null : next) 
 *     } 
 * } 
 */ 
function   partition ( head :   ListNode   |   null ,   x :   number ) :   ListNode   |   null   { 
     const   [ l ,   r ]   =   [ new   ListNode (),   new   ListNode ()]; 
     let   [ tl ,   tr ]   =   [ l ,   r ]; 
     for   (;   head ;   head   =   head . next )   { 
         if   ( head . val   <   x )   { 
             tl . next   =   head ; 
             tl   =   tl . next ; 
         }   else   { 
             tr . next   =   head ; 
             tr   =   tr . next ; 
         } 
     } 
     tr . next   =   null ; 
     tl . next   =   r . next ; 
     return   l . next ; 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 // Definition for singly-linked list. 
// #[derive(PartialEq, Eq, Clone, Debug)] 
// pub struct ListNode { 
//   pub val: i32, 
//   pub next: Option<Box<ListNode>> 
// } 
// 
// impl ListNode { 
//   #[inline] 
//   fn new(val: i32) -> Self { 
//     ListNode { 
//       next: None, 
//       val 
//     } 
//   } 
// } 
impl   Solution   { 
     pub   fn   partition ( head :   Option < Box < ListNode >> ,   x :   i32 )   ->   Option < Box < ListNode >>   { 
         let   mut   l   =   ListNode :: new ( 0 ); 
         let   mut   r   =   ListNode :: new ( 0 ); 
         let   mut   tl   =   & mut   l ; 
         let   mut   tr   =   & mut   r ; 
         let   mut   current   =   head ; 
         while   let   Some ( mut   node )   =   current   { 
             current   =   node . next . take (); 
             if   node . val   <   x   { 
                 tl . next   =   Some ( node ); 
                 tl   =   tl . next . as_mut (). unwrap (); 
             }   else   { 
                 tr . next   =   Some ( node ); 
                 tr   =   tr . next . as_mut (). unwrap (); 
             } 
         } 
         tr . next   =   None ; 
         tl . next   =   r . next ; 
         l . next 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 /** 
 * Definition for singly-linked list. 
 * function ListNode(val, next) { 
 *     this.val = (val===undefined ? 0 : val) 
 *     this.next = (next===undefined ? null : next) 
 * } 
 */ 
/** 
 * @param {ListNode} head 
 * @param {number} x 
 * @return {ListNode} 
 */ 
var   partition   =   function   ( head ,   x )   { 
     const   [ l ,   r ]   =   [ new   ListNode (),   new   ListNode ()]; 
     let   [ tl ,   tr ]   =   [ l ,   r ]; 
     for   (;   head ;   head   =   head . next )   { 
         if   ( head . val   <   x )   { 
             tl . next   =   head ; 
             tl   =   tl . next ; 
         }   else   { 
             tr . next   =   head ; 
             tr   =   tr . next ; 
         } 
     } 
     tr . next   =   null ; 
     tl . next   =   r . next ; 
     return   l . next ; 
}; 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 /** 
 * Definition for singly-linked list. 
 * public class ListNode { 
 *     public int val; 
 *     public ListNode next; 
 *     public ListNode(int val=0, ListNode next=null) { 
 *         this.val = val; 
 *         this.next = next; 
 *     } 
 * } 
 */ 
public   class   Solution   { 
     public   ListNode   Partition ( ListNode   head ,   int   x )   { 
         ListNode   l   =   new   ListNode (); 
         ListNode   r   =   new   ListNode (); 
         ListNode   tl   =   l ,   tr   =   r ; 
         for   (;   head   !=   null ;   head   =   head . next )   { 
             if   ( head . val   <   x )   { 
                 tl . next   =   head ; 
                 tl   =   tl . next ; 
             }   else   { 
                 tr . next   =   head ; 
                 tr   =   tr . next ; 
             } 
         } 
         tr . next   =   null ; 
         tl . next   =   r . next ; 
         return   l . next ; 
     } 
}