Hello World

吞风吻雨葬落日 欺山赶海踏雪径

0%

分隔链表

题目

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你应当 保留 两个分区中每个节点的初始相对位置。(满足条件的元素的顺序不变)

img

我的解答

创建两条新的链表,分别是大于x和小于x的链表,遍历一遍head链表就可以填满两条新链表。
最后把两条链表收尾想接就成了满足条件的链表了。

注意这里也使用了虚拟头节点方便创建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public ListNode partition(ListNode head, int x) {

ListNode h1 = new ListNode() ,h2 = new ListNode();
ListNode p1 = h1,p2 = h2,p=head;

while (p != null){
if(p.val < x){
p1.next = p;
p1 = p1.next;
}else{
p2.next = p;
p2 = p2.next;
}
p=p.next;
}
// 断开p2 后续
p2.next = null;
p1.next = h2.next;

return h1.next;
}

官方参考

思路完全一致,代码都完全一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode small = new ListNode(0);
ListNode smallHead = small;
ListNode large = new ListNode(0);
ListNode largeHead = large;
while (head != null) {
if (head.val < x) {
small.next = head;
small = small.next;
} else {
large.next = head;
large = large.next;
}
head = head.next;
}
large.next = null;
small.next = largeHead.next;
return smallHead.next;
}
}

链接:https://leetcode.cn/problems/partition-list/