【Leetcode】拿捏链表(三)——CM11 链表分割(牛客)、OR36 链表的回文结构(牛客)

简介: 【Leetcode】拿捏链表(三)——CM11 链表分割(牛客)、OR36 链表的回文结构(牛客)

作者:一个喜欢猫咪的的程序员

专栏:《Leetcode》

喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》


目录

CM11 链表分割

OR36 链表的回文结构


CM11 链表分割


链表分割_牛客题霸_牛客网

【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力

https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70

题目:

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。


示例:

本题没有示例


思路:

本题我们利用两个guard1、guard2带头的链表,将他们合成一个链表来完成。


我们开辟一个链表结构体struct ListNode大小的动态空间n1、n2,将其强制类型转换为结构体指针struct ListNode*来将题目给的链表分为两个小链表。


我们让n1和guard1指向同一块动态空间,n2和guard2也是同理。

我们利用一个cur来遍历原链表,如果val比x小就尾插到第一个链表n1中,负责尾插到第二个链表n2中。

5f54fab5a1c347c2818afe3985ab2792.gif

我们需要额外考虑一种情况,当第二个链表的尾不是原链表的最后一个时,n2的next不为空会出现环装链表的问题,我们需要将n2.next=NULL。

时间复杂度:O(N)                                                             空间复杂度:O(N)

代码实现:

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        struct ListNode* guard1;
        struct ListNode* guard2;
        struct ListNode* cur=pHead;
        struct ListNode* n1;
        struct ListNode* n2;
        n1=guard1=(struct ListNode*)malloc(sizeof(struct ListNode));
        n2=guard2=(struct ListNode*)malloc(sizeof(struct ListNode));
        n2->next=n1->next=NULL;
        while(cur)
        {
            if(cur->val<x)
            {
                n1->next=cur;
                n1=n1->next;
            }
            else
            {
                n2->next=cur;
                n2=n2->next;
            }
            cur=cur->next;
        }
        n1->next=guard2->next;
        n2->next=NULL;
        pHead=guard1->next;
        free(guard1);
        free(guard2);
        return pHead;
    }
};

OR36 链表的回文结构


链表的回文结构_牛客题霸_牛客网

【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力

https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa

题目:

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。


示例:

思路:

本题要求我们必须在O(1)的空间复杂度,因此我们不能去开数组,将他们一个个存起来。


我们可以将链表的后半段逆置,然后再将中间节点与头结点的元素做比较,判断是否相等。


这里逆置和查找中间节点的函数可以看一下我的另外2篇博客:


http://t.csdn.cn/82sv7

http://t.csdn.cn/82sv7

http://t.csdn.cn/HAJ2A

http://t.csdn.cn/HAJ2A

时间复杂度:O(N)                                                               空间复杂度:O(1)


代码实现:

class PalindromeList {
public:
struct ListNode* reverseList(struct ListNode* head){
    if (head == NULL || head->next == NULL) {
        return head;
    }
    struct ListNode*newhead=reverseList(head->next);
    head->next->next=head;
    head->next=NULL;
    return newhead;
}
struct ListNode* middleNode(struct ListNode* head){
    if(head->next==NULL)
    {
        return head;
    }
    struct ListNode*left=head;
    struct ListNode*right=head;
    struct ListNode*ans=head;
    while(right!=NULL&&right->next!=NULL)
    {
        left=left->next;
        right=right->next->next;
    }
    ans=left;
    return ans;
}
    bool chkPalindrome(ListNode* A) {
        // write code here
        struct ListNode*mid=middleNode(A);
        struct ListNode*rhead=reverseList(mid);
        while(A&&rhead)
        {
            if(A->val!=rhead->val)
            return false;
            A=A->next;
            rhead=rhead->next;
        }
        return true;
    }
};


相关文章
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
164 1
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
206 0
Leetcode第21题(合并两个有序链表)
|
6月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
294 1
|
8月前
|
算法 Go
【LeetCode 热题100】深入理解二叉树结构变化与路径特性(力扣104 / 226 / 114 / 543)(Go语言版)
本博客深入探讨二叉树的深度计算、结构变换与路径分析,涵盖四道经典题目:104(最大深度)、226(翻转二叉树)、114(展开为链表)和543(二叉树直径)。通过递归与遍历策略(前序、后序等),解析每题的核心思路与实现方法。结合代码示例(Go语言),帮助读者掌握二叉树相关算法的精髓。下一讲将聚焦二叉树构造问题,欢迎持续关注!
225 10
|
8月前
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
312 10
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
156 0
LeetCode第二十四题(两两交换链表中的节点)
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
203 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
278 0
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
277 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
388 2

热门文章

最新文章