链表
双指针
题目描述
给你一个链表的头节点 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 ;
}
}