问题:

给定一个链表的头节点 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

解答思路:

要实现该题,我们可以定义两个新的链表:一个链表用来存放小于 x 的节点,另一个链表用来存放大于等于 x 的节点。然后将两个链表连接起来,注意保持小于 x 的节点的相对顺序。

具体步骤如下:

1. 创建两个新的链表:smallerHead 和 greaterHead,用于存放小于 x 和大于等于 x 的节点。

2. 遍历原链表,将小于 x 的节点连接到 smallerHead 链表中,将大于等于 x 的节点连接到 greaterHead 链表中。

3. 将 greaterHead 的链表连接到 smallerHead 的尾部,形成最终的链表。

4. 注意处理边界情况,如链表为空或只有一个节点。

以下是代码实现:

public ListNode partition(ListNode head, int x) {

    ListNode smallerHead = new ListNode(0); // 存放小于 x 的节点

    ListNode greaterHead = new ListNode(0); // 存放大于等于 x 的节点

    ListNode smaller = smallerHead; // smaller 指向 smallerHead

    ListNode greater = greaterHead; // greater 指向 greaterHead

    ListNode curr = head; // 遍历原链表的指针


    while (curr != null) {

        if (curr.val < x) {

            smaller.next = curr; // 将当前节点连接到 smaller 链表

            smaller = smaller.next; // smaller 向后移动一位

        } else {

            greater.next = curr; // 将当前节点连接到 greater 链表

            greater = greater.next; // greater 向后移动一位

        }

        curr = curr.next; // 当前节点向后移动一位

    }


    greater.next = null; // 将 greater 链表的尾部置为空

    smaller.next = greaterHead.next; // 将 greater 链表连接到 smaller 链表的尾部


    return smallerHead.next; // 返回最终的链表头节点

}

时间复杂度:O(n),其中 n 是链表的长度。

空间复杂度:O(1)。

(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)

05-12 11:55