1. 题目描述
给你一个链表和一个特定值 x ,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入:head = 1->4->3->2->5->2, x = 3输出:1->2->2->4->3->5
2. 解题思路
对于这道题目,一个很直接的思路就是初始化两个链表,一个链表来存储小于x的值,另一个链表来存储大于x的值。
这里还初始化了两个链表:mallHead 和 largeHead。这两个是链表的哑节点,即它们的 next 指针指向链表的头节点,这样做的目的是为了更方便地处理头节点为空的边界条件。
遍历结束后,将 large 的 next 指针置空,这是因为当前节点复用的是原链表的节点,而其 next 指针可能指向一个小于 x 的节点,我们需要切断这个引用。同时将 small 的 next 指针指向 largeHead 的 next 指针指向的节点,即真正意义上的 large 链表的头节点。最后返回 smallHead 的 next 指针就是最后的答案。
复杂度分析:
- 时间复杂度: O(n),其中 n 是原链表的长度,因为对该链表进行了一次遍历。
-
3. 代码实现
/*** Definition for singly-linked list.* function ListNode(val) {* this.val = val;* this.next = null;* }*//*** @param {ListNode} head* @param {number} x* @return {ListNode}*/var partition = function(head, x) {let small = new ListNode(0)const smallHead = smalllet large = new ListNode(0)const largeHead = largewhile(head){if(head.val < x){small.next = headsmall = small.next}else{large.next = headlarge = large.next}head = head.next}large.next = nullsmall.next = largeHead.nextreturn smallHead.next};
4. 提交结果

