LeetCode(86):分隔链表

Medium!

题目描述:

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

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

示例:

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

解题思路:

这道题要求我们划分链表,把所有小于给定值的节点都移到前面,大于该值的节点顺序不变,相当于一个局部排序的问题。那么可以想到的一种解法是首先找到第一个大于或等于给定值的节点,用题目中给的例子来说就是先找到4,然后再找小于3的值,每找到一个就将其取出置于4之前即可

C++解法一:

复制代码
 1 class Solution {
 2 public:
 3     ListNode *partition(ListNode *head, int x) {
 4         ListNode *dummy = new ListNode(-1);
 5         dummy->next = head;
 6         ListNode *pre = dummy, *cur = head;;
 7         while (pre->next && pre->next->val < x) pre = pre->next;
 8         cur = pre;
 9         while (cur->next) {
10             if (cur->next->val < x) {
11                 ListNode *tmp = cur->next;
12                 cur->next = tmp->next;
13                 tmp->next = pre->next;
14                 pre->next = tmp;
15                 pre = pre->next;
16             } else {
17                 cur = cur->next;
18             }
19         }
20         return dummy->next;
21     }
22 };
复制代码

这种解法的链表变化顺序为:

1 -> 4 -> 3 -> 2 -> 5 -> 2 

1 -> 2 -> 4 -> 3 -> 5 -> 2 

1 -> 2 -> 2 -> 4 -> 3 -> 5

此题还有一种解法,就是将所有小于给定值的节点取出组成一个新的链表,此时原链表中剩余的节点的值都大于或等于给定值,只要将原链表直接接在新链表后即可。

C++解法二:

复制代码
 1 class Solution {
 2 public:
 3     ListNode *partition(ListNode *head, int x) {
 4         if (!head) return head;
 5         ListNode *dummy = new ListNode(-1);
 6         ListNode *newDummy = new ListNode(-1);
 7         dummy->next = head;
 8         ListNode *cur = dummy, *p = newDummy;
 9         while (cur->next) {
10             if (cur->next->val < x) {
11                 p->next = cur->next;
12                 p = p->next;
13                 cur->next = cur->next->next;
14                 p->next = NULL;
15             } else {
16                 cur = cur->next;
17             }
18         }
19         p->next = dummy->next;
20         return newDummy->next;
21     }
22 };
复制代码

此种解法链表变化顺序为:

Original: 1 -> 4 -> 3 -> 2 -> 5 -> 2 

New:

 

Original: 4 -> 3 -> 2 -> 5 -> 2 

New:   1

 

Original: 4 -> 3 -> 5 -> 2 

New:   1 -> 2

 

Original: 4 -> 3 -> 5 

New:   1 -> 2 -> 2

 

Original: 

New:   1 -> 2 -> 2 -> 4 -> 3 -> 5 

posted @   Ariel_一只猫的旅行  阅读(1912)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示