LeetCode 第 86 号问题:分割链表

红太狼 2023-06-13 09:10 134阅读 0赞

本文首发于公众号「五分钟学算法」,是 图解 LeetCode 系列文章之一。
个人网站: https://www.cxyxiaowu.com

题目来源于 LeetCode 上第 86 号问题:分割链表。题目难度为 Easy,目前通过率为 47.8% 。

题目描述

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

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

示例:

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

题目解析

这道题要求我们划分链表,把所有小于给定值的节点都移到前面,大于该值的节点顺序不变,相当于一个局部排序的问题。

  • 设定两个虚拟节点,dummyHead1用来保存小于于该值的链表,dummyHead2来保存大于等于该值的链表
  • 遍历整个原始链表,将小于该值的放于dummyHead1中,其余的放置在dummyHead2
  • 遍历结束后,将dummyHead2插入到dummyHead1后面

动画描述

v2-95e51f37d82139fd831e8c6e045e7db5\_b.gif

代码实现

  1. class Solution {
  2. public:
  3. ListNode* partition(ListNode* head, int x) {
  4. ListNode* dummyHead1 = new ListNode(-1);
  5. ListNode* dummyHead2 = new ListNode(-1);
  6. ListNode* prev1 = dummyHead1;
  7. ListNode* prev2 = dummyHead2;
  8. for(ListNode* cur = head ; cur != NULL ;){
  9. if(cur->val < x){
  10. prev1->next = cur;
  11. cur = cur->next;
  12. prev1 = prev1->next;
  13. prev1->next = NULL;
  14. }
  15. else{
  16. prev2->next = cur;
  17. cur = cur->next;
  18. prev2 = prev2->next;
  19. prev2->next = NULL;
  20. }
  21. }
  22. prev1->next = dummyHead2->next;
  23. ListNode* ret = dummyHead1->next;
  24. delete dummyHead1;
  25. delete dummyHead2;
  26. return ret;
  27. }
  28. };

v2-3af2339a6056d546cf4383d39233e8fa\_b.jpg

发表评论

表情:
评论列表 (有 0 条评论,134人围观)

还没有评论,来说两句吧...

相关阅读

    相关 leetcode86. 分隔

    给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。 示例: 输入: he

    相关 leetcode 86 分隔

    给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。 示例: 输入: he

    相关 leetcode---86. 分隔

    给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。 示例: 输入