輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的節點仍然是遞增排序的。
示例:
輸入:1 --> 2 --> 5 --> null 2 --> 4 --> 7 --> null
輸出:1 --> 2 --> 2 --> 4 --> 5 --> 7 --> null
限制:0 <= 鍊錶長度 <= 1000
方法一:正常哨兵結點求解
class
solution
else
prev = prev.next;
}//迴圈結束時,兩表中至多有乙個是非空的;
//由於均有序,所以非空鍊錶包含的所有元素都比前面已經合併的鍊錶中的所有元素要大,直接拼上返回即可
prev.next = l1 == null ? l2 : l1;
return prehead.next;
}}
方法二:遞迴
搜得經典遞迴方法(1945 j. von neumann)
遞迴地定義在兩個煉表裡的 merge 操作(忽略邊界情況,比如空煉表等)
即兩個鍊錶頭部較小的乙個與剩下元素的 merge 操作結果合併。
再考慮邊界情況,特殊的,如果 l1 或者 l2 一開始就是 null ,那麼沒有任何操作需要合併,所以我們只需要返回非空鍊錶。否則,我們要判斷 l1 和 l2 哪乙個的頭元素更小,然後遞迴地決定下乙個新增到結果裡的值。如果兩個鍊錶都是空的,那麼過程終止,所以遞迴過程最終一定會終止。
class
solution
else
if(l2 == null)
else
if(l1.val < l2.val)
else
}}
複雜度分析
時間複雜度:o(n + m)。 因為每次呼叫遞迴都會去掉 l1 或者 l2 的頭元素(直到至少有乙個鍊錶為空),函式 mergetwolist 中只會遍歷每個元素一次。所以,時間複雜度與合併後的鍊錶長度為線性關係。
空間複雜度:o(n + m)。呼叫 mergetwolists 退出時 l1 和 l2 中每個元素都一定已經被遍歷過了,所以 n + m個棧幀會消耗 o(n + m) 的空間。
劍指Offer每日一題08
定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 限制 0 節點個數 5000 方法一 日常雙指標,好用不要錢public class listnode public listnode reverse...
劍指Offer第一題
在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。思路 從數值中間開始查詢,根據題意,二維陣列的左上角是最小值,二維陣列的右下角是最大值,從中間數值查詢是最節約時間的,可以從左下角或者...
劍指offer 第一題
這題思路不難,但是關於二維陣列的邊界問題,差點把我整崩潰 題目描述 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。這題的思路就是找乙個中間值,讓他在陣列查詢...