国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

算法打卡|Day4 鏈表part02

這篇具有很好參考價值的文章主要介紹了算法打卡|Day4 鏈表part02。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Day4 鏈表part02

今日任務
● 24. 兩兩交換鏈表中的節(jié)點
● 19.刪除鏈表的倒數第N個節(jié)點
● 面試題 02.07. 鏈表相交
● 142.環(huán)形鏈表II


目錄
    • Day4 鏈表part02
  • Problem: 24. 兩兩交換鏈表中的節(jié)點
    • 思路
    • 解題方法
    • Code
    • Code
  • Problem: 19. 刪除鏈表的倒數第 N 個結點
    • 思路
    • 解題方法
    • Code
  • Problem: 面試題 02.07. 鏈表相交
    • 思路
    • 解題方法
    • 復雜度
    • Code
  • Problem: 24. 兩兩交換鏈表中的節(jié)點
    • 思路
    • 解題方法
    • Code
    • Code

Problem: 24. 兩兩交換鏈表中的節(jié)點

思路

1.迭代法就要注意畫圖!畫圖!還是畫圖!另外迭代的次序不要忘記,鏈表迭代統(tǒng)一從左往右迭代。用三個結點去一遍遍迭代

2.使用遞歸法,先交換前兩個結點,然后指向遞歸好的鏈表就行。

解題方法

迭代或遞歸文章來源地址http://www.zghlxwxcb.cn/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)
拓展
*/

//思路:兩兩交換鏈表中的節(jié)點,拿第一個節(jié)點頭節(jié)點head與第二個節(jié)點newHead(newHead = head.next) 來講,需要將head與newHead交換位置,使newHead變成鏈表中的頭節(jié)點,head變成第二個節(jié)點,然后head再指向已經處理好的鏈表,以此類推,遞歸調用本身,直到最后只剩下一個節(jié)點或者為空,結束返回新的頭指針,也就是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 個結點

思路

首先我們要用快慢指針,快指針先走,慢指針再和快指針同步走。不過,要刪除一個節(jié)點需要走到那個節(jié)點的前一個,所以我們要讓快指針多走一個。比如要刪除倒數第二個節(jié)點,我們就要讓快指針先走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個節(jié)點,應該返回空,而不是原來的hea(head發(fā)生了改變);并且slow改變的是虛擬節(jié)點后續(xù)的鏈表
      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指向下一個節(jié)點
          else//p1走到結尾
              p1 = headB;//p1指向另一個鏈表頭
          if(p2 != NULL)//p2沒有走到結尾
              p2 = p2->next;//p2指向下一個節(jié)點
          else  //p2走到結尾 
              p2 = headA;//p2指向另一個鏈表頭
      }
      return p1;
      
  }
};

Problem: 24. 兩兩交換鏈表中的節(jié)點

目錄
    • Day4 鏈表part02
  • Problem: 24. 兩兩交換鏈表中的節(jié)點
    • 思路
    • 解題方法
    • Code
    • Code
  • Problem: 19. 刪除鏈表的倒數第 N 個結點
    • 思路
    • 解題方法
    • Code
  • Problem: 面試題 02.07. 鏈表相交
    • 思路
    • 解題方法
    • 復雜度
    • Code
  • Problem: 24. 兩兩交換鏈表中的節(jié)點
    • 思路
    • 解題方法
    • Code
    • Code

思路

1.迭代法就要注意畫圖!畫圖!還是畫圖!另外迭代的次序不要忘記,鏈表迭代統(tǒng)一從左往右迭代。用三個結點去一遍遍迭代

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)
拓展
*/

//思路:兩兩交換鏈表中的節(jié)點,拿第一個節(jié)點頭節(jié)點head與第二個節(jié)點newHead(newHead = head.next) 來講,需要將head與newHead交換位置,使newHead變成鏈表中的頭節(jié)點,head變成第二個節(jié)點,然后head再指向已經處理好的鏈表,以此類推,遞歸調用本身,直到最后只剩下一個節(jié)點或者為空,結束返回新的頭指針,也就是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模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Day28- 貪心算法part02

    題目一:122. 買賣股票的最佳時機II 122. 買賣股票的最佳時機 II 給你一個整數數組? prices ?,其中? prices[i] ?表示某支股票第? i ?天的價格。 在每一天,你可以決定是否購買和/或出售股票。你在任何時候? 最多 ?只能持有? 一股 ?股票。你也可以先購買,然后在? 同一天 ?

    2024年01月15日
    瀏覽(19)
  • Day32 貪心算法part02

    太牛了我,隨隨便便雙指針秒殺 md題解里面雙指針都沒用直接for循環(huán)秒殺 寫成這樣純粹是沒有看到第一次跳躍必須從第一個開始

    2024年02月20日
    瀏覽(21)
  • 代碼隨想錄day4 | 24. 兩兩交換鏈表中的節(jié)點 19.刪除鏈表的倒數第N個節(jié)點 02.07.鏈表相交 142.環(huán)形鏈表II

    代碼隨想錄day4 | 24. 兩兩交換鏈表中的節(jié)點 19.刪除鏈表的倒數第N個節(jié)點 02.07.鏈表相交 142.環(huán)形鏈表II

    24. 兩兩交換鏈表中的節(jié)點 19.刪除鏈表的倒數第N個節(jié)點 面試題 02.07. 鏈表相交 142.環(huán)形鏈表II 兩兩交換鏈表中的節(jié)點 注意是兩兩交換,采用虛擬頭結點的方法,因為每次操作單鏈表都需要找到前一個指針。奇數節(jié)點數,最后一個不變;偶數節(jié)點數,就是正常的兩兩交換。 操作

    2024年02月16日
    瀏覽(26)
  • 代碼隨想錄Day4:24. 兩兩交換鏈表中的節(jié)點,19.刪除鏈表的倒數第N個節(jié)點 ,面試題 02.07. 鏈表相交 ,142.環(huán)形鏈表II

    代碼隨想錄Day4:24. 兩兩交換鏈表中的節(jié)點,19.刪除鏈表的倒數第N個節(jié)點 ,面試題 02.07. 鏈表相交 ,142.環(huán)形鏈表II

    題目要求: ?使用虛擬頭節(jié)點,代碼實現(xiàn): 題目要求: 我的思路: 先通過while語句找出整體鏈表的size,再算出要刪除結點前一個結點的索引。 更簡單(更妙)的方法:快慢指針法 代碼實現(xiàn): 題目要求: 看到題目自己首先的想法就是暴力搜索,但是會做很多不必要的遍歷。

    2024年02月20日
    瀏覽(23)
  • 【LeetCode題目詳解】24.兩兩交換鏈表中的節(jié)點19.刪除鏈表的倒數第N個節(jié)點 面試題 02.07. 鏈表相交 142.環(huán)形鏈表II day4(補)

    【LeetCode題目詳解】24.兩兩交換鏈表中的節(jié)點19.刪除鏈表的倒數第N個節(jié)點 面試題 02.07. 鏈表相交 142.環(huán)形鏈表II day4(補)

    ? 給定一個鏈表,兩兩交換其中相鄰的節(jié)點,并返回交換后的鏈表。 你不能只是單純的改變節(jié)點內部的值,而是需要實際的進行節(jié)點交換。 這道題建議使用 虛擬頭結點 ,這樣會方便很多,要不然每次針對頭結點(沒有前一個指針指向頭結點),還要單獨處理。 接下來就是

    2024年02月15日
    瀏覽(20)
  • 算法刷題Day4 兩兩交換鏈表中的節(jié)點+刪除鏈表的倒數第N個結點+鏈表相交+環(huán)形鏈表

    使用dummy節(jié)點可以極大地簡化過程 有個地方折磨了我有一會兒,是粗心導致的,而且提示的錯誤也很難發(fā)現(xiàn)是哪里導致的。就是在case為 head = [1], n = 1 時,最后釋放了 tmp 之后(此時 tmp 剛好指向 head ,我還 return head; ,意思就是操作了已經被我釋放的內存, leetcode 就報錯了

    2024年02月09日
    瀏覽(26)
  • 新星計劃Day6【數據結構與算法】 鏈表Part2

    新星計劃Day6【數據結構與算法】 鏈表Part2

    ?????博客主頁:京與舊鋪的博客主頁 ?歡迎關注??點贊??收藏?留言? ??本文由京與舊鋪原創(chuàng),csdn首發(fā)! ??系列專欄:java學習 ??首發(fā)時間:??2022年4月30日?? ??你做三四月的事,八九月就會有答案,一起加油吧 ??如果覺得博主的文章還不錯的話,請三連支持一

    2023年04月08日
    瀏覽(23)
  • 藍橋杯備賽 | 洛谷做題打卡day4

    藍橋杯備賽 | 洛谷做題打卡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日
    瀏覽(23)
  • Day32 貪心算法 part02 122. 買賣股票的最佳時機 II 55. 跳躍游戲 45. 跳躍游戲 II

    思路:計算每天的利潤,利潤如果為正,加到結果中去

    2024年01月19日
    瀏覽(30)
  • day4-反轉鏈表

    力扣題目鏈接 給你單鏈表的頭節(jié)點 head ,請你反轉鏈表,并返回反轉后的鏈表。 面試常考的題型,這里帶來兩種做法,一種雙指針,一種迭代法。 第一次看到題目時,我第一時間想到的是,先從第一個結點找到最后一個,然后再依次翻轉。但是這樣的時間復雜度就是O(2n)

    2024年02月16日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包