算法入門必讀:Merge Two Sorted Lists(合併兩個有序鍊表)

2021-03-02 BitTiger

今天我們來討論一下如何將兩個鍊表合併的問題。

我們來看一下問題的具體描述:有兩個單向鍊表,它們每個節點都有一個數字,且節點中的數字按照升序排列,現在需要合併這兩個鍊表,合併後仍然是按照升序排列。

舉例如下:

 

我們最先想到的應該是會用暴力方法來解決這個問題,即將直接將L2鍊表連接到L1鍊表後,形成新的鍊表,然後對新的鍊表進行排序。

雖然這個方法是可行的,但是這個方法並不是最好的,這個方法主要的耗時在於重新排序,它的時間複雜度是O(m+n)log(m+n),m和n分別是L1和L2鍊表的長度,稍後我們會給出更加優雅的方案以供討論。

 

在提出第二種方案之前,需要提一下可能會用到的一個「工具」——虛擬節點(dummy node),虛擬節點是當我們合併兩個鍊表時不知道哪個節點是新鍊表節點的頭節點時會用到。對於我們之前提到的這個問題,我們會用到兩個指針p1(指向L1頭節點)、p2(指向L2頭節點),前面提到的虛擬節點和當前節點(current node,用於循環,被初始化指向虛擬節點)。通過循環訪問所有節點來構成新的鍊表。在每次循環中,會比較兩個鍊表中p1和p2指向的節點的值,使當前節點一直指向較小值節點的下一節點。如下圖:

在第一步中,p1指向的節點值為2,p2指向節點值為6,2小於6,所以curr指向p1,p1指向下一節點,即指向節點值為5的節點,如下圖:

第二步中,p1指向的節點的值仍然小於p2指向的節點的值,所以繼續向後移動,如下圖:

第三步中,p1指向的節點的值大於p2指向的節點的值,curr指向p2當前指向的節點,p2向後移動,如下圖:

以此類推,直到p1或者p2指針移動到鍊表的末端,因為我們在每次比較中都選擇較小的值,所以當p1或者p2中任何一個指針指向鍊表末端,代表另外一個沒有還沒到達末端的鍊表的後序的值都比已到達末端的鍊表中最大的值要大,所以只需要將後續的節點追加到新的鍊表後即可。代碼如下:

接下來我們介紹一下第三種方法,就是用遞歸的方式解決這個問題。遞歸(recursion)是一種在計算機科學中非常基本且普遍的思考問題的方式。典型的遞歸思路就是可以把問題變為更小的問題,並且這個更小的問題可以繼續遞歸成更小的問題,知道這個問題小到到達一個邊界條件(boundary condition),以至於可以很輕鬆地解決。

在這個問題中,我們的邊界條件很簡單,就是當L2指向了null,返回L1或者L1指向了null,返回L2。如果L1或者L2沒有指向null,就需要比較L1和L2對應的值哪個更小,當有結果以後,這個新的鍊表就更長了,而需要比較的鍊表就更短了,顯然,這樣這個問題就比較之前的簡單了,如此反覆遞歸即可。代碼如下:

為你詳細講解十二個常見算法問題,不僅讓你學會如何掌握這些問題的解題代碼,還會讓你學到解決算法問題所必需的四類解題模板,讓你輕鬆應對各類新問題。↓↓↓

相關焦點

  • LeetCode-21.Merge Two Sorted Lists | 合併兩個有序鍊表
    題目LeetCode[1]LeetCode-cn[2]Merge two sorted linked lists and
  • LeetCode Top 100 高頻算法題 21. Merge Two Sorted Lists
    LeetCode算法題有一個技巧:先看每道題的example,大部分情況看完example就能理解題目意思;如果看完example還有疑惑,可以再回過頭來看英文題目,這樣也可以節省一點時間~Merge two sorted linked lists and return it as a
  • LeetCode-23.合併K個排序鍊表(Merge k Sorted Lists)
    合併K個升序鍊表合併 k 個排序鍊表,返回合併後的排序鍊表。請分析和描述算法的複雜度。示例:輸入:[ 1->4->5, 1->3->4, 2->6]輸出: 1->1->2->3->4->4->5->6來源:力扣(LeetCode)連結:https://leetcode-cn.com/problems/merge-k-sorted-lists
  • 合併兩個有序鍊表 | Leetcode題解
    題目描述將兩個升序鍊表合併為一個新的升序鍊表並返回。新鍊表是通過拼接給定的兩個鍊表的所有節點組成的。 return l2作者:LeetCode-Solution連結:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/
  • Merge k Sorted Lists
    [傳送門](https://leetcode.com/problems/merge-k-sorted-lists/)## 題意
  • Merge Two Sorted Lists
    題目描述(簡單難度)題目描述:將兩個升序鍊表合併為一個新的
  • LeetCode Top 100 高頻算法題 23. Merge k Sorted Lists
    linked-list is sorted in ascending order.Merge all the linked-lists into one sorted linked-list and return it.
  • Merge k Sorted Lists
    請你將所有鍊表合併到一個升序鍊表中,返回合併後的鍊表。我們用 N表示鍊表的總長度,考慮最壞情況,k 個鍊表的長度相等,都為 n 。解法一 暴力破解簡單粗暴,遍歷所有的鍊表,將數字存到一個數組裡,然後用快速排序,最後再將排序好的數組存到一個鍊表裡。
  • ​LeetCode刷題實戰23:合併K個升序鍊表
    所以,為了提高大家的算法能力,這個公眾號後續每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家聊的問題叫做合併K個升序鍊表,我們先來看題面:https://leetcode-cn.com/problems/merge-k-sorted-lists/Given an array of linked-lists lists, each linked list is sorted in ascending order.Merge
  • LeetCode鍊表合併題目解析
    leetcode鍊表合併相關題目:21_merge-two-sorted-lists1699_merge-in-between-linked-lists21_merge-two-sorted-lists1、題目描述將兩個升序鍊表合併為一個新的 升序 鍊表並返回。
  • 14種模式搞定面試算法編程題(PART II)
    應用場景舉個慄子11、Modified binary search無論何時給定排序數組,鍊表或矩陣,並要求查找某個元素,你可以使用的最佳算法是二分搜索。此模式描述了處理涉及二分搜索的所有問題的有效方法。二分搜索這麼經典的思路我就不多介紹啦,直接看一個可視化複習一下
  • 【面試錦囊】14種模式搞定面試算法編程題(8-14)
    為了更方便大家的交流溝通,我們建立了算法面試討論組,感興趣的小夥伴可以訂閱後臺回復"面試"加入應用場景舉個慄子11、Modified binary search無論何時給定排序數組,鍊表或矩陣,並要求查找某個元素,你可以使用的最佳算法是二分搜索。此模式描述了處理涉及二分搜索的所有問題的有效方法。二分搜索這麼經典的思路我就不多介紹啦,直接看一個可視化複習一下
  • Leetcode刷題-鍊表
    合併兩個有序鍊表難度:簡單將兩個升序鍊表合併為一個新的 升序 鍊表並返回。新鍊表是通過拼接給定的兩個鍊表的所有節點組成的。插入排序算法:插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。每次迭代中,插入排序只從輸入數據中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
  • 面試官系列 - LeetCode鍊表知識點&題型總結
    Sorted Lists 【easy】題意:將兩個排序好的鍊表合併成新的有序鍊表test case:Input: 1->2->4, 1->3->4Output: 1->1->2->3->4->4解題思路: 迭代法和遞歸法。
  • 網際網路大廠算法面試題集合,看完我跪了!
    使用指南其中算法,主要是以下幾種:數據結構,主要有如下幾種:數組與鍊表:單 / 雙向鍊表棧與隊列哈希表堆:最大堆 / 最小堆樹與圖:最近公共祖先、併查集字符串:前綴樹(字典樹) / 後綴樹精彩預告0042.trapping-rain-water
  • 給Java程式設計師的20個鍊表面試題
    如何使用棧計算兩個鍊表的和?答案:https://www.geeksforgeeks.org/sum-of-two-linked-lists/9. 如何在適當的位置反轉鍊表?答案:http://www.java67.com/2017/06/5-difference-between-array-and-linked.html10.
  • 鍊表的邏輯:Beyond CRUD
    、多個鍊表的合併,可以認為是較為複雜的」增「操作。現在我們重新回到合併問題,實際上兩個鍊表合併是一個很輕鬆愉快的操作,利用虛節點建立一個新的列表,然後一一向前比較連接即可:class Solution {    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {        if(l1 == null) return l2;
  • Median of Two Sorted Arrays
    Median of Two Sorted Arrays[1]題目There are two sorted arrays 「nums1」 and 「nums2」 of size m and n respectively.
  • 網際網路公司最常見的面試算法題大集合!
    其中算法,主要是以下幾種:數據結構,主要有如下幾種:數組與鍊表:單 / 雙向鍊表棧與隊列哈希表堆:最大堆 / 最小堆樹與圖:最近公共祖先、併查集/blob/master/problems/26.remove-duplicates-from-sorted-array.md🆕 88.merge-sorted-array:https://github.com/azl397985856/leetcode/blob/master/problems/88.merge-sorted-array.md136.single-number