• LeetCode 第 86 号问题:分割链表


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

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

    题目描述

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

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

    示例:

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

    题目解析

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

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

    动画描述


    v2-95e51f37d82139fd831e8c6e045e7db5_b.gif


    代码实现

            class Solution {
    public:
        ListNode* partition(ListNode* head, int x) {
    
            ListNode* dummyHead1 = new ListNode(-1);
            ListNode* dummyHead2 = new ListNode(-1);
            ListNode* prev1 = dummyHead1;
            ListNode* prev2 = dummyHead2;
    
            for(ListNode* cur = head ; cur != NULL ;){
                if(cur->val < x){
                    prev1->next = cur;
                    cur = cur->next;
                    prev1 = prev1->next;
                    prev1->next = NULL;
                }
                else{
                    prev2->next = cur;
                    cur = cur->next;
                    prev2 = prev2->next;
                    prev2->next = NULL;
                }
            }
    
            prev1->next = dummyHead2->next;
            ListNode* ret = dummyHead1->next;
    
            delete dummyHead1;
            delete dummyHead2;
            return ret;
        }
    };
          


    v2-3af2339a6056d546cf4383d39233e8fa_b.jpg

  • 相关阅读:
    php的错误处理机制
    php的自动加载函数spl_autoload_register和__autoload
    mysql日志配置
    01,易语言网页填表
    mac 的全文搜索
    react native 热更新
    码云的使用教程
    autolayout实现水平三等分
    mac命令行快捷键
    什么是延展性(Malleability,可鍛性)
  • 原文地址:https://www.cnblogs.com/csnd/p/16675391.html
Copyright © 2020-2023  润新知