抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

中等题目。

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

你应当 保留 两个分区中每个节点的初始相对位置。

示例 1:

1
2
3
4
5
6
7
8
9
10
11
12
输入: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
思路

本题为单链表,关键点为虚拟头节点断开原链表节点的next指针防止成环。新建两条链表,把小于x的节点放在链表1,大于等于x的放在链表2,然后合并链表。

解法
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
/**
* 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 dummy1 = new ListNode(-1), dummy2 = new ListNode(-1), p1 = dummy1, p2 = dummy2;
ListNode p = head;

while(p != null) {
if (p.val < x) {
p1.next = p;
p1 = p1.next;
} else {
p2.next = p;
p2 = p2.next;
}

// 断开链
ListNode tmp = p.next;
p.next = null;
p = tmp;
}

p1.next = dummy2.next;

return dummy1.next;
}
}

评论