算法打卡|Day4 链表part02

这篇具有很好参考价值的文章主要介绍了算法打卡|Day4 链表part02。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Day4 链表part02

今日任务
● 24. 两两交换链表中的节点
● 19.删除链表的倒数第N个节点
● 面试题 02.07. 链表相交
● 142.环形链表II


目录
    • Day4 链表part02
  • Problem: 24. 两两交换链表中的节点
    • 思路
    • 解题方法
    • Code
    • Code
  • Problem: 19. 删除链表的倒数第 N 个结点
    • 思路
    • 解题方法
    • Code
  • Problem: 面试题 02.07. 链表相交
    • 思路
    • 解题方法
    • 复杂度
    • Code
  • Problem: 24. 两两交换链表中的节点
    • 思路
    • 解题方法
    • Code
    • Code

Problem: 24. 两两交换链表中的节点

思路

1.迭代法就要注意画图!画图!还是画图!另外迭代的次序不要忘记,链表迭代统一从左往右迭代。用三个结点去一遍遍迭代

2.使用递归法,先交换前两个结点,然后指向递归好的链表就行。

解题方法

迭代或递归文章来源地址https://www.toymoban.com/news/detail-710354.html

Code


/**
时间复杂度:O(n)
空间复杂度:O(1)
*/
class Solution {
public:
  ListNode* swapPairs(ListNode* head) {
      auto dummy = new ListNode(0,head);
      ListNode* a = dummy;
      while (a->next != nullptr && a->next->next != nullptr){          

          ListNode* b = a->next;
          ListNode* c = a->next->next;
          a->next = c;
          b->next =c->next;
          c->next =b;
          a = b;
      }
      return dummy->next;
  }
  
};

Code


/**
时间复杂度:O(n)
空间复杂度:O(n)
拓展
*/

//思路:两两交换链表中的节点,拿第一个节点头节点head与第二个节点newHead(newHead = head.next) 来讲,需要将head与newHead交换位置,使newHead变成链表中的头节点,head变成第二个节点,然后head再指向已经处理好的链表,以此类推,递归调用本身,直到最后只剩下一个节点或者为空,结束返回新的头指针,也就是newHead
class Solution {
public:
  ListNode* swapPairs(ListNode* head) {
      //递归边界条件, 有2个结点才需要交换
      if(head == nullptr || head->next == nullptr){
          return head;
      }
      ListNode* newHead =head->next;
      head->next = swapPairs(newHead->next);
      newHead->next = head;
      return newHead;
  }
};

Problem: 19. 删除链表的倒数第 N 个结点

思路

首先我们要用快慢指针,快指针先走,慢指针再和快指针同步走。不过,要删除一个节点需要走到那个节点的前一个,所以我们要让快指针多走一个。比如要删除倒数第二个节点,我们就要让快指针先走3格。最后记得虚拟头结点,因为可能涉及到真实头结点的删除。

解题方法

双指针

Code


/**
时间复杂度: O(n)
空间复杂度: O(1)
*/
class Solution {
public:
  ListNode* removeNthFromEnd(ListNode* head, int n) {
      ListNode* dummyhead = new ListNode(0, head);
      ListNode* fast = dummyhead;
      ListNode* slow = dummyhead;
      n++;
      while(n-- && fast != nullptr){
          fast = fast->next;
      }

      while(fast!=nullptr){
          slow = slow->next;
          fast = fast->next;
      }

      slow->next = slow->next->next;

      //此处不能head,因为如果只有1个节点,应该返回空,而不是原来的hea(head发生了改变);并且slow改变的是虚拟节点后续的链表
      return dummyhead->next;

  }
};

Problem: 面试题 02.07. 链表相交

思路

如果有公共结点肯定是在后面重叠,且后面部分都是共同的。
方法1:先计算出两个链表的长度,可以让比较长的先走两个链表长度之差的步数,两个再一起走。
方法2:不同部分为a, 和b,公共部分为c;a + c + b = b + c + a;让两个一起走,a走到头就转向b, b走到头转向a,则在公共部分相遇。

解题方法

双指针法

复杂度

  • 时间复杂度:

$O(2n)$

  • 空间复杂度:

$O(1)$

Code


/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
  ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
      ListNode *p1 = headA;
      ListNode *p2 = headB;

      while (p1 != p2) {
          if(p1 != NULL)//p1没有走到结尾
              p1 = p1->next;//p1指向下一个节点
          else//p1走到结尾
              p1 = headB;//p1指向另一个链表头
          if(p2 != NULL)//p2没有走到结尾
              p2 = p2->next;//p2指向下一个节点
          else  //p2走到结尾 
              p2 = headA;//p2指向另一个链表头
      }
      return p1;
      
  }
};

Problem: 24. 两两交换链表中的节点

目录
    • Day4 链表part02
  • Problem: 24. 两两交换链表中的节点
    • 思路
    • 解题方法
    • Code
    • Code
  • Problem: 19. 删除链表的倒数第 N 个结点
    • 思路
    • 解题方法
    • Code
  • Problem: 面试题 02.07. 链表相交
    • 思路
    • 解题方法
    • 复杂度
    • Code
  • Problem: 24. 两两交换链表中的节点
    • 思路
    • 解题方法
    • Code
    • Code

思路

1.迭代法就要注意画图!画图!还是画图!另外迭代的次序不要忘记,链表迭代统一从左往右迭代。用三个结点去一遍遍迭代

2.使用递归法,先交换前两个结点,然后指向递归好的链表就行。

解题方法

迭代或递归

Code


/**
时间复杂度:O(n)
空间复杂度:O(1)
*/
class Solution {
public:
  ListNode* swapPairs(ListNode* head) {
      auto dummy = new ListNode(0,head);
      ListNode* a = dummy;
      while (a->next != nullptr && a->next->next != nullptr){          

          ListNode* b = a->next;
          ListNode* c = a->next->next;
          a->next = c;
          b->next =c->next;
          c->next =b;
          a = b;
      }
      return dummy->next;
  }
  
};

Code


/**
时间复杂度:O(n)
空间复杂度:O(n)
拓展
*/

//思路:两两交换链表中的节点,拿第一个节点头节点head与第二个节点newHead(newHead = head.next) 来讲,需要将head与newHead交换位置,使newHead变成链表中的头节点,head变成第二个节点,然后head再指向已经处理好的链表,以此类推,递归调用本身,直到最后只剩下一个节点或者为空,结束返回新的头指针,也就是newHead
class Solution {
public:
  ListNode* swapPairs(ListNode* head) {
      //递归边界条件, 有2个结点才需要交换
      if(head == nullptr || head->next == nullptr){
          return head;
      }
      ListNode* newHead =head->next;
      head->next = swapPairs(newHead->next);
      newHead->next = head;
      return newHead;
  }
};

到了这里,关于算法打卡|Day4 链表part02的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Day32 贪心算法part02

    太牛了我,随随便便双指针秒杀 md题解里面双指针都没用直接for循环秒杀 写成这样纯粹是没有看到第一次跳跃必须从第一个开始

    2024年02月20日
    浏览(30)
  • Day28- 贪心算法part02

    题目一:122. 买卖股票的最佳时机II 122. 买卖股票的最佳时机 II 给你一个整数数组  prices  ,其中  prices[i]  表示某支股票第  i  天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候  最多  只能持有  一股  股票。你也可以先购买,然后在  同一天  

    2024年01月15日
    浏览(37)
  • 代码随想录day4 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 02.07.链表相交 142.环形链表II

    24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II 两两交换链表中的节点 注意是两两交换,采用虚拟头结点的方法,因为每次操作单链表都需要找到前一个指针。奇数节点数,最后一个不变;偶数节点数,就是正常的两两交换。 操作

    2024年02月16日
    浏览(28)
  • 代码随想录Day4:24. 两两交换链表中的节点,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 ,142.环形链表II

    题目要求:  使用虚拟头节点,代码实现: 题目要求: 我的思路: 先通过while语句找出整体链表的size,再算出要删除结点前一个结点的索引。 更简单(更妙)的方法:快慢指针法 代码实现: 题目要求: 看到题目自己首先的想法就是暴力搜索,但是会做很多不必要的遍历。

    2024年02月20日
    浏览(32)
  • 【LeetCode题目详解】24.两两交换链表中的节点19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II day4(补)

      给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 这道题建议使用 虚拟头结点 ,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。 接下来就是

    2024年02月15日
    浏览(31)
  • 算法刷题Day4 两两交换链表中的节点+删除链表的倒数第N个结点+链表相交+环形链表

    使用dummy节点可以极大地简化过程 有个地方折磨了我有一会儿,是粗心导致的,而且提示的错误也很难发现是哪里导致的。就是在case为 head = [1], n = 1 时,最后释放了 tmp 之后(此时 tmp 刚好指向 head ,我还 return head; ,意思就是操作了已经被我释放的内存, leetcode 就报错了

    2024年02月09日
    浏览(37)
  • 新星计划Day6【数据结构与算法】 链表Part2

    👩‍💻博客主页:京与旧铺的博客主页 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:🎞2022年4月30日🎠 🎨你做三四月的事,八九月就会有答案,一起加油吧 🀄如果觉得博主的文章还不错的话,请三连支持一

    2023年04月08日
    浏览(44)
  • 蓝桥杯备赛 | 洛谷做题打卡day4

    高精度加法,相当于 a+b problem, 不用考虑负数 。 分两行输入。 a , b ≤ 1 0 500 a,b leq 10^{500} a , b ≤ 1 0 500 。 输出只有一行,代表 a + b a+b a + b 的值。 样例输入 #1 样例输出 #1 样例输入 #2 样例输出 #2 学会利用新知,自己多试试并尝试积攒一些固定解答方案,debug,以下是我的

    2024年01月17日
    浏览(37)
  • Day32 贪心算法 part02 122. 买卖股票的最佳时机 II 55. 跳跃游戏 45. 跳跃游戏 II

    思路:计算每天的利润,利润如果为正,加到结果中去

    2024年01月19日
    浏览(37)
  • day4-反转链表

    力扣题目链接 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 面试常考的题型,这里带来两种做法,一种双指针,一种迭代法。 第一次看到题目时,我第一时间想到的是,先从第一个结点找到最后一个,然后再依次翻转。但是这样的时间复杂度就是O(2n)

    2024年02月16日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包