当前位置:   article > 正文

【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中。

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

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


代码实现:

  1. class Partition {
  2. public:
  3. ListNode* partition(ListNode* pHead, int x) {
  4. // write code here
  5. struct ListNode* guard1;
  6. struct ListNode* guard2;
  7. struct ListNode* cur=pHead;
  8. struct ListNode* n1;
  9. struct ListNode* n2;
  10. n1=guard1=(struct ListNode*)malloc(sizeof(struct ListNode));
  11. n2=guard2=(struct ListNode*)malloc(sizeof(struct ListNode));
  12. n2->next=n1->next=NULL;
  13. while(cur)
  14. {
  15. if(cur->val<x)
  16. {
  17. n1->next=cur;
  18. n1=n1->next;
  19. }
  20. else
  21. {
  22. n2->next=cur;
  23. n2=n2->next;
  24. }
  25. cur=cur->next;
  26. }
  27. n1->next=guard2->next;
  28. n2->next=NULL;
  29. pHead=guard1->next;
  30. free(guard1);
  31. free(guard2);
  32. return pHead;
  33. }
  34. };

OR36 链表的回文结构

链表的回文结构_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa题目:

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


示例:


思路:

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

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

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

http://t.csdn.cn/82sv7http://t.csdn.cn/82sv7http://t.csdn.cn/HAJ2Ahttp://t.csdn.cn/HAJ2A时间复杂度:O(N)                                                               空间复杂度:O(1)


代码实现:

  1. class PalindromeList {
  2. public:
  3. struct ListNode* reverseList(struct ListNode* head){
  4. if (head == NULL || head->next == NULL) {
  5. return head;
  6. }
  7. struct ListNode*newhead=reverseList(head->next);
  8. head->next->next=head;
  9. head->next=NULL;
  10. return newhead;
  11. }
  12. struct ListNode* middleNode(struct ListNode* head){
  13. if(head->next==NULL)
  14. {
  15. return head;
  16. }
  17. struct ListNode*left=head;
  18. struct ListNode*right=head;
  19. struct ListNode*ans=head;
  20. while(right!=NULL&&right->next!=NULL)
  21. {
  22. left=left->next;
  23. right=right->next->next;
  24. }
  25. ans=left;
  26. return ans;
  27. }
  28. bool chkPalindrome(ListNode* A) {
  29. // write code here
  30. struct ListNode*mid=middleNode(A);
  31. struct ListNode*rhead=reverseList(mid);
  32. while(A&&rhead)
  33. {
  34. if(A->val!=rhead->val)
  35. return false;
  36. A=A->next;
  37. rhead=rhead->next;
  38. }
  39. return true;
  40. }
  41. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/528581
推荐阅读
相关标签
  

闽ICP备14008679号