86. 分隔链表
leetcode.cn/problems/partition-list/description/" rel="nofollow">题目描述
给你一个链表的头节点 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
小的节点
- C 语言
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
struct ListNode* partition(struct ListNode* head, int x) {struct ListNode* str1 = malloc(sizeof(struct ListNode));struct ListNode* str2 = malloc(sizeof(struct ListNode));struct ListNode* str1_h = str1;struct ListNode* str2_h = str2;while (NULL != head) {if (head->val < x) {str1->next = head;str1 = str1->next;} else {str2->next = head;str2 = str2->next;}head = head->next;}str2->next = NULL;str1->next = str2_h->next;return str1_h->next;
}
复杂度分析
时间复杂度为 O(n),其中 n 是原链表的长度。
空间复杂度为 O(1)。