LeetCode刷題--21.合併兩個有序鏈表(簡單)

題目描述

將兩個有序鏈表合併爲一個新的有序鏈表並返回。新鏈表是經過拼接給定的兩個鏈表的全部節點組成的。 html

示例:node

輸入:1 -> 2 -> 4 1 -> 3 -> 4算法

輸出:1 -> 1 -> 2 -> 3 -> 4 -> 4spa

方法 1:遞歸

思路

 

  • 特殊的,若是 l1 或者 l2 一開始就是 null ,那麼沒有任何操做須要合併,因此咱們只須要返回非空鏈表。
  • 終止條件:兩條鏈表分別名爲 l1 和 l2,當 l1 爲空或 l2 爲空時結束
  • 返回值:每一層調用都返回排序好的鏈表頭
  • 本級遞歸內容:若是 l1 的 val 值更小,則將 l1.next 與排序好的鏈表頭相接,l2 同理
  • O),m 爲 l1 的長度,n 爲 l2 的長度

 

代碼實現

class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //若是 l1 或者 l2 一開始就是 null ,說明不須要合併,因此咱們只須要返回非空鏈表
        if(l1 == null) { return l2; } if(l2 == null) { return l1; } //若是11的val值更小,則將11.next與排序好的鏈表頭相接,12同理
        if(l1.val < l2.val) { l1.next = mergeTwoLists(l1.next, l2); //每一層調用都返回排序好的鏈表頭
            return l1; } else { l2.next = mergeTwoLists(l1, l2.next); return l2; } } }

 

圖解算法

 

 

方法二:迭代

 

思路

咱們假設 l1 元素嚴格比 l2元素少,咱們能夠將 l2 中的元素逐一插入 l1中正確的位置。3d

 

  • 首先,咱們設定一個哨兵節點 "prehead" ,這能夠在最後讓咱們比較容易地返回合併後的鏈表。咱們維護一個 prev 指針,咱們須要作的是調整它的 next 指針。
  • 而後,咱們重複如下過程,直到 l1 或者 l2 指向了 null :若是 l1 當前位置的值小於等於 l2 ,咱們就把 l1 的值接在 prev 節點的後面同時將 l1 指針日後移一個。不然,咱們對 l2 作一樣的操做。無論咱們將哪個元素接在了後面,咱們都把 prev 向後移一個元素。
  • 在循環終止的時候, l1 和 l2 至多有一個是非空的。因爲輸入的兩個鏈表都是有序的,因此無論哪一個鏈表是非空的,它包含的全部元素都比前面已經合併鏈表中的全部元素都要大。這意味着咱們只須要簡單地將非空鏈表接在合併鏈表的後面,並返回合併鏈表。

 

代碼實現

class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //先初始化一個預先指針 prehead,該指針的下一個節點指向真正的頭結點head,是用來定位頭結點的
        listnode prehead = new listnode(-1); listnode prev = prehead; //遍歷列表l1和l2,直到所有遍歷完畢
        while (l1 != null && l2 != null) { if (l1.val <= l2.val) { //prev.next始終指向比較以後的那個小的,l2同理
                prev.next = l1; //當前位置的l1後移一位
                l1 = l1.next; } else { prev.next = l2; l2 = l2.next; } prev = prev.next; } //在循環終止的時候, l1 和 l2 至多有一個是非空的。 //須要將非空鏈表接在合併鏈表的後面,並返回合併鏈表。
        prev.next = l1 == null ? l2 : l1; return prehead.next; } }

 

 

圖解算法

 

 

 

 

 

依次類推,最後:指針

相關文章
相關標籤/搜索