刷題(day02)

1、leetcode136.刪除鏈表的結點

給定單向鏈表的頭指針和一個要刪除的節點的值,定義一個函數刪除該節點。

返回刪除后的鏈表的頭節點。

示例 1:

輸入: head = [4,5,1,9], val = 5
輸出: [4,1,9]
解釋: 給定你鏈表中值為?5?的第二個節點,那么在調用了你的函數之后,該鏈表應變為 4 -> 1 -> 9.

示例 2:

輸入: head = [4,5,1,9], val = 1
輸出: [4,5,9]
解釋: 給定你鏈表中值為?1?的第三個節點,那么在調用了你的函數之后,該鏈表應變為 4 -> 5 -> 9.

① 雙指針求解

?

public ListNode deleteNode(ListNode head, int val) {//初始化一個虛擬節點ListNode dummy = new ListNode(0);//讓虛擬節點指向頭結點dummy.next = head;ListNode cur = head;ListNode pre = dummy;while (cur != null) {if (cur.val == val) {//如果找到要刪除的結點,直接把他刪除pre.next = cur.next;break;}//如果沒找到,pre指針和cur指針都同時往后移一步pre = cur;cur = cur.next;}//最后返回虛擬節點的下一個結點即可return dummy.next;
}
  • 刪除一個結點,先獲取該結點的上一個結點?

?② 遞歸

public ListNode deleteNode(ListNode head,int val){if(head == null) return head;if(head.var == val) return head.next;head.next = deleteNode(head.next,val);return head;
}

?2、leetcode24.兩兩交換鏈表中的結點

給你一個鏈表,兩兩交換其中相鄰的節點,并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能進行節點交換)。

示例 1:

輸入:head = [1,2,3,4]
輸出:[2,1,4,3]

示例 2:

輸入:head = []
輸出:[]

示例 3:

輸入:head = [1]
輸出:[1]

提示:

  • 鏈表中節點的數目在范圍?[0, 100]?內
  • 0 <= Node.val <= 100

?① 非遞歸

class Solution {public ListNode swapPairs(ListNode head) {ListNode dummy = new ListNode(0,head);ListNode temp = dummy;while(temp.next != null && temp.next.next != null){ListNode start = temp.next;ListNode end = temp.next.next;temp.next = end;start.next = end.next;end.next = start;temp = start;}return dummy.next;}
}

② 遞歸(沒看懂!)

class Solution {public ListNode swapPairs(ListNode head){  if(head == null ||  head.next == null){return head;}ListNode next = head.next;head.next =  swapPairs(next.next);next.next = head;return next;}
}

3、leetcode160.相交鏈表

給你兩個單鏈表的頭節點?headA?和?headB?,請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表不存在相交節點,返回?null?。

圖示兩個鏈表在節點?c1?開始相交

題目數據?保證?整個鏈式結構中不存在環。

注意,函數返回結果后,鏈表必須?保持其原始結構?。

自定義評測:

評測系統?的輸入如下(你設計的程序?不適用?此輸入):

  • intersectVal?- 相交的起始節點的值。如果不存在相交節點,這一值為?0
  • listA?- 第一個鏈表
  • listB?- 第二個鏈表
  • skipA?- 在?listA?中(從頭節點開始)跳到交叉節點的節點數
  • skipB?- 在?listB?中(從頭節點開始)跳到交叉節點的節點數

評測系統將根據這些輸入創建鏈式數據結構,并將兩個頭節點?headA?和?headB?傳遞給你的程序。如果程序能夠正確返回相交節點,那么你的解決方案將被?視作正確答案?。

?

示例 :

輸入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
輸出:null
解釋:從各自的表頭開始算起,鏈表 A 為 [2,6,4],鏈表 B 為 [1,5]。
由于這兩個鏈表不相交,所以 intersectVal 必須為 0,而 skipA 和 skipB 可以是任意值。
這兩個鏈表不相交,因此返回 null 。

?

提示:

  • listA?中節點數目為?m
  • listB?中節點數目為?n
  • 1 <= m, n <= 3 * 104
  • 1 <= Node.val <= 105
  • 0 <= skipA <= m
  • 0 <= skipB <= n
  • 如果?listA?和?listB?沒有交點,intersectVal?為?0
  • 如果?listA?和?listB?有交點,intersectVal == listA[skipA] == listB[skipB]

?

進階:你能否設計一個時間復雜度?O(m + n)?、僅用?O(1)?內存的解決方案?

① 雙指針

解題思路:設【第一個公共點】為 node,【鏈表 headA】的結點數量為 a,【鏈表? headB】的結點數量為 b,【兩鏈表的公共尾部】的節點數量為? c,則有:

  • 頭節點 headA 到? node 前,共有? a - c 個節點;
  • 頭節點 headB?到? node 前,共有? b?- c 個節點;

?考慮構建兩個節點指針 A , B 分別指向兩鏈表頭節點 headA,headB,做如下操作:

  • 指針 A 先遍歷完鏈表 headA,再開始遍歷鏈表 headB,當走到 node 時,共走步數為:

a + (b - c)

  • 指針 B 先遍歷完鏈表 headB,再開始遍歷鏈表 headA,當走到 node 時,共走步數為:

?b + (a - c)

  • 如下式所示,此時指針 A ,B 重合,并有兩種情況:

a + (b - c) = b + (a - c)

  1. 若兩鏈表有公共尾部(即 c > 0):指針 A , B 同時指向【第一個公共節點】 node
  2. 若兩鏈表無公共尾部(即 c = 0):指針 A , B 同時指向 null

因此返回 A 即可。

public class Solution {public ListNode getIntersectionNode(ListNode headA,ListNode headB){if (headA == null || headB == null) {return null;}ListNode A = headA, B =  headB;while(A != B){A = A != null ? A.next : headB;;B = B != null ? B.next : headA;}return A;}
}

② 哈希集合

判斷兩個鏈表是否相交,可以使用哈希集合存儲鏈表節點。

首先遍歷鏈表 headA,并將鏈表 headA 中的每個節點加入哈希集合中。然后遍歷鏈表 headB,對于遍歷到的每個節點,判斷該節點是否在哈希集合中:

  • 如果當前節點不在哈希集合中,則繼續遍歷下一個節點
  • 如果當前節點在哈希集合中,則后面的節點都在哈希集合中,即從當前節點開始的所有結點都在兩個鏈表的相交部分,因此在鏈表 headB 中遍歷的第一個在哈希集合中的節點就是兩個量表相交的節點,返回該節點。
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {Set<ListNode> visited = new HashSet<ListNode>();ListNode temp = headA;while (temp != null) {visited.add(temp);temp = temp.next;}temp = headB;while (temp != null) {if (visited.contains(temp)) {return temp;}temp = temp.next;}return null;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42577.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42577.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42577.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows圖形界面(GUI)-SDK-C/C++ - 應用程序結構

公開視頻 -> 鏈接點擊跳轉公開課程博客首頁 -> 鏈接點擊跳轉博客主頁 目錄 入口函數 窗口注冊 窗口創建 窗口顯示 窗口更新 消息循環 窗口過程 窗口銷毀 調試信息 示例代碼 入口函數 在Windows應用程序中&#xff0c;WinMain是主函數&#xff0c;作為應用程序…

網格化監控:Eureka與分布式服務網格的協同監控

網格化監控&#xff1a;Eureka與分布式服務網格的協同監控 引言 在微服務架構中&#xff0c;服務網格技術提供了一種有效的方式來管理和監控服務間的通信。Eureka作為Netflix開源的服務發現框架&#xff0c;雖然本身不直接提供服務網格的監控功能&#xff0c;但可以與服務網格…

設計模式探索:適配器模式

1. 適配器模式介紹 1.1 適配器模式介紹 適配器模式&#xff08;adapter pattern&#xff09;的原始定義是&#xff1a;將一個類的接口轉換為客戶期望的另一個接口&#xff0c;適配器可以讓不兼容的兩個類一起協同工作。 適配器模式的主要作用是把原本不兼容的接口&#xff0c…

【Python_GUI】thinker布局管理——place方法

place方法可以設置組件的大小以及組件在容器中的精確位置&#xff0c;其參數及含義如下&#xff1a; 參數含義X設置組件距離窗口左側的水平距離y設置組件距離窗口頂部的垂直距離width設置組件的寬度height設置組件的高度relx設置組件距離窗口左側的相對距離&#xff0c;范圍為…

c++初階學習----入門(上)

大家好啊。最近學習了一點關于c的知識。這不就迫不及待的來與大家分享了嘛。但我這也是現學現賣所以咧。有很多遺落甚至不對的地方希望大家可以在評論區里面指出來。這樣也可以增加大家對知識的鞏固。 c語言與c的聯系 不知道大家看到c會不會不由自主的聯想到C語言啊。畢竟都是…

手機自帶錄屏在哪?6個軟件教你快速進行手機錄屏

手機自帶錄屏在哪&#xff1f;6個軟件教你快速進行手機錄屏 手機自帶的錄屏功能可以讓你輕松錄制屏幕上的內容&#xff0c;記錄游戲過程、制作教程或捕捉其他重要時刻。不同品牌的手機可能在不同位置提供錄屏功能。以下是一些常見的手機品牌及其錄屏功能位置&#xff0c;以及一…

【康復學習--LeetCode每日一題】724. 尋找數組的中心下標

題目&#xff1a; 給你一個整數數組 nums &#xff0c;請計算數組的 中心下標 。 數組 中心下標 是數組的一個下標&#xff0c;其左側所有元素相加的和等于右側所有元素相加的和。 如果中心下標位于數組最左端&#xff0c;那么左側數之和視為 0 &#xff0c;因為在下標的左側不…

運動愛好者的新選擇:哈氪聆光氣傳導耳機,輕巧又安全

平時不管是漫步街頭、騎行穿梭&#xff0c;還是乘坐公共交通時&#xff0c;我總是喜歡佩戴耳機&#xff0c;借此隔絕外部的喧囂&#xff0c;享受音樂的樂趣。在戶外使用耳機&#xff0c;我更傾向于選擇氣傳導耳機&#xff0c;它們更符合我的需求&#xff0c;因為這種耳機能讓我…

優雅下線的藝術:Eureka服務管理深度解析

優雅下線的藝術&#xff1a;Eureka服務管理深度解析 引言 在微服務架構中&#xff0c;服務的動態注冊與發現是保證系統高可用性的關鍵。Eureka作為Netflix開源的服務發現框架&#xff0c;提供了服務注冊與發現的基本功能。然而&#xff0c;服務在下線時如何做到"優雅&qu…

每日一編程,早點拿offer

計算字符串最后一個單詞的長度&#xff0c;單詞以空格隔開 輸入描述&#xff1a; 輸入一行&#xff0c;代表要計算的字符串&#xff0c;非空 輸出描述&#xff1a; 輸出一個整數&#xff0c;表示輸入字符串最后一個單詞的長度。 輸入&#xff1a;hello world輸出&#xff1a…

kubernetes集群證書過期問題解決

kubernetes集群證書過期問題解決 問題描述檢查證書是否過期更新證書master節點操作node節點操作 問題描述 K8S 各個組件需要與 api-server 進行通信&#xff0c;通信使用的證書都存放在 /etc/kubernetes/pki 路徑下&#xff0c;kubeadm 生成的證書大部分默認有效期為 1 年&…

SECS/GEM快速完成半導體設備通訊

金南瓜幫助國內大量從事半導體前道設備開發研制、生產的設備廠商&#xff0c;通過快速提供穩定可靠的SECS/GEM、GEM300產品&#xff0c;為客戶在激光退火、濕法設備&#xff08;清洗、鍍膜等&#xff09;、離子注入、MOCVD、PVD等客戶專注于核心工藝提升&#xff0c;提升企業的…

`CyclicBarrier` 是 Java 中的一個同步輔助工具類,它允許一組線程相互等待,直到所有線程都達到了某個公共屏障點(barrier point)

CyclicBarrier 是 Java 中的一個同步輔助工具類&#xff0c;它允許一組線程相互等待&#xff0c;直到所有線程都達到了某個公共屏障點&#xff08;barrier point&#xff09;。當所有線程都到達屏障點時&#xff0c;它們可以繼續執行后續操作。CyclicBarrier 的特點是可以重復使…

中介子方程五十

XXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXXhXiXXηXWXXhXuXVXXΣXXΣXyXiXXKXeXuXWXXyXLXαXXaXnXaXXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXXhXiXXηXWXXhXuXVXXΣXXΣXyXiXXKXeXuXWXXyXLXαXXaXnXaXXFXXuXXWXXuXXdXXrXXαXXuXpX…

Gen4Gen:多概念個性化圖像生成的數據驅動革新

個性化文本到圖像生成模型在用戶控制生成過程方面取得了重要進展。這些模型能夠通過少量訓練樣本學習并合成包含新穎個性化概念的圖像&#xff0c;例如用戶的寵物或特定物品。然而&#xff0c;現有技術在處理多概念個性化時存在局限性&#xff0c;尤其是在生成包含多個相似概念…

連接與隔離:Facebook在全球化背景下的影響力

在當今全球化的背景下&#xff0c;Facebook作為全球最大的社交網絡平臺&#xff0c;不僅連接了世界各地的人們&#xff0c;還在全球社會、經濟和文化中發揮著深遠的影響。本文將深入探討Facebook在全球化進程中的作用&#xff0c;以及其對個體和社會之間連接與隔離的雙重影響。…

【續集】Java之父的退休之旅:從軟件殿堂到多彩人生的探索

Java之父的退休之旅&#xff1a;從軟件殿堂到多彩人生的探索-CSDN博客 四、科技領袖退休后的行業影響 4.1 傳承與啟迪 Gosling等科技領袖的退休&#xff0c;為行業內部年輕一代提供了更多的發展機會和成長空間。他們的退休不僅意味著權力和責任的交接&#xff0c;更是一種精…

等保測評新趨勢:應對數字化轉型中的安全挑戰

隨著信息技術的飛速發展&#xff0c;數字化轉型已成為企業提升競爭力、優化運營效率的重要手段。然而&#xff0c;這一轉型過程中&#xff0c;企業也面臨著前所未有的安全挑戰。等保測評&#xff08;信息安全等級保護測評&#xff09;作為保障信息系統安全的重要手段&#xff0…

html5路由如何在nginx上部署(vite+vue3)

我們知道前端常用的有Hash 模式和html5模式的路由&#xff0c;hash模式在nginx上部署不需要額外的操作&#xff0c;而html5模式則需要額外設置&#xff0c;這里介紹下如何在nginx根地址&#xff08;location / {}&#xff09;下部署和在非根地址上&#xff08;location /admin{…

【MATLAB源碼-第232期】基于matlab的 (204,188) RS編碼解碼仿真,采用QPSK調制輸出誤碼率曲線。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 Reed-Solomon碼&#xff08;RS碼&#xff09;是一類廣泛應用于數字通信和存儲系統中的糾錯碼&#xff0c;尤其在光盤、衛星通信和QR碼等領域有著重要作用。RS碼是一種非二進制的糾刪碼&#xff0c;由Irving S. Reed和Gustave…