墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. 算法
  3. 正文

每日一道算法题:合并两个有序链表

2023年 7月 28日 89点热度 0人点赞 0条评论

题目描述

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

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

例如:

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

思路分析

本题要求按照某个条件将链表分成两部分,可以采用双指针的方法实现,跑一遍循环,小于 x 的元素放在前面,大于等于 x 的元素放在后面。

具体实现步骤如下:

  1. 实例化两个链表:lessList 用于存放小于 x 的值,greaterList 用于存放大于等于 x 的值。

  2. 遍历原链表,将小于 x 的值拼接到 lessList 上,将大于等于 x 的值拼接到 greaterList 上。

  3. 将 greaterList 链接到 lessList 的末尾,返回 lessList。

代码实现

public ListNode partition(ListNode head, int x) {
    ListNode lessList = new ListNode(0); // 存放小于 x 的链表
    ListNode greaterList = new ListNode(0); // 存放 >= x 的链表
    ListNode lessCur = lessList; // 定义 lessList 指针
    ListNode greaterCur = greaterList; // 定义 greaterList 指针

    // 遍历原链表,根据值大小拼接链表
    while (head != null) {
        if (head.val < x) {
            lessCur.next = head;
            lessCur = lessCur.next;
        } else {
            greaterCur.next = head;
            greaterCur = greaterCur.next;
        }
        head = head.next;
    }

    // 链接 lessList 和 greaterList
    greaterCur.next = null;
    lessCur.next = greaterList.next;
    return lessList.next;
}

时间复杂度分析

该算法仅遍历链表一次,所以时间复杂度为 O(n)。

测试例子

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

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

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

扩展点

不同语言的实现

Python:

def partition(self, head: ListNode, x: int) -> ListNode:
    less_list = ListNode(0)
    greater_list = ListNode(0)
    less_cur, greater_cur = less_list, greater_list

    while head:
        if head.val < x:
            less_cur.next = head
            less_cur = less_cur.next
        else:
            greater_cur.next = head
            greater_cur = greater_cur.next
        head = head.next

    greater_cur.next = None
    less_cur.next = greater_list.next
    return less_list.next

C++:

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode* less_list = new ListNode(0); // 存放小于 x 的链表
        ListNode* greater_list = new ListNode(0); // 存放 >= x 的链表
        ListNode* less_cur = less_list; // 定义 lessList 指针
        ListNode* greater_cur = greater_list; // 定义 greaterList 指针

        // 遍历原链表,根据值大小拼接链表
        while (head != nullptr) {
            if (head->val < x) {
                less_cur->next = head;
                less_cur = less_cur->next;
            } else {
                greater_cur->next = head;
                greater_cur = greater_cur->next;
            }
            head = head->next;
        }

        // 链接 lessList 和 greaterList
        greater_cur->next = nullptr;
        less_cur->next = greater_list->next;
        return less_list->next;
    }
};

对数据结构的深入理解和介绍

链表是一种常用的数据结构,其特点是节点不连续,每个节点存储了下一个节点的指针,因此可扩展性很强,但也更加复杂。在实际应用中,适用于需要频繁进行插入和删除操作的场合。常用的链表包括单向链表、双向链表、循环链表等。

总结

分隔链表是关于链表的一道经典难题,考察的是对链表的基本操作和指针运用能力。通过本题的实现,我们不仅可以掌握基本的链表操作技巧,还可以更全面地了解和掌握数据结构链表的概念和应用。此外,通过编写代码实现,也可以更深刻地理解时间和空间复杂度的概念,从而更好地提升编程和算法能力。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java 动态规划 合并 数组 算法 链表
最后更新:2023年 6月 23日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
告别机械感!OpenAudio S1让AI声音活起来 Sora触手可及!微软必应AI视频生成器,全民创作时代来临? 阿里WebAgent开源:引领自主搜索新纪元 重磅炸弹!字节跳动开源BAGEL:70亿参数,统一多模态理解与生成,AI“全能王”诞生记! 小米MiMo-VL:7B参数,怎么就成了多模态界的“越级打怪王”? 炸裂!DeepSeek 8B 量化版降临:告别显存焦虑,你的 3080 Ti 也能玩转顶级大模型了!
炸裂!微软这门免费AI Agent新手课,GitHub近2万星,简直是宝藏!ComfyUI“打通任督二脉”:直接调用Veo2、GPT-4o等65大模型!一键串联你的AI工作流AI圈炸锅了!Mistral Medium 3:性能 SOTA,成本打骨折,企业玩家的新宠?字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”!字节跳动 Seed-Coder-8B:不靠人工洗数据,这80亿参数的小模型如何写出顶尖代码?
风暴眼中的新王:阿里通义千问 Qwen2 登顶开源竞技场,Qwen2.5-Omni 或将掀起新浪潮? 设计模式:代理设计模式 AI的"万能插座"来了!Anthropic祭出MCP协议:1个接口打通所有软件,终结API时代 Spring Cloud 当下最火的Java微服务框架 从零开始,详细讲解如何在服务器上安装、配置和使用宝塔面板:一站式解决网站管理问题 Java学习必备:基础语法知识点梳理
标签聚合
deepseek spring 动态规划 算法 教程 AI 设计模式 java

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策