算法題其實不要慌就好了,就是過久沒作了。算法
1. 拆成兩個數組合並 2. 構造一個新數組,爲的是不影響原數組,並且修改數組比插入數字消耗少 3. 由於源數組自己有序,因此可根據順序,減小運算次數 4. 結果數組弄個遊標,初始爲0,記錄操做位置,從兩個數組取出值比較,小的數加入到結果數組,再從小的數這個數組再取數比較,直到大於另一個數組的數,時間複雜度爲O(n)
# encoding='utf8' def list_merge(list_a, list_b): '''返回兩個數組合並的結果''' len_a = len(list_a) len_b = len(list_b) result = [None for i in range(len_a + len_b)] # 構造返回數組 cursor_r = -1 # result遊標 cursor_b = 0 # list_b遊標 # 依次從數組的最前面取出最小的數,更新到結果數組 for item_a in list_a: for idx in range(cursor_b, len_b): cursor_r += 1 # 移動遊標 item_b = list_b[idx] if item_a > item_b: result[cursor_r] = item_b cursor_b += 1 # 移動list_b的遊標 else: result[cursor_r] = item_a # 由於list_a是for循環遍歷,因此不須要遊標 break # 繼續從list_a取數 # 由於是採用兩兩比較,放入最小的數,因此會致使丟失最大的數,這裏加入最大數 last = max(a[-1], b[-1]) result[-1] = last return result if __name__ == '__main__': a = [1, 2, 3, 4, 5] b = [2, 3, 4, 6] c = list_merge(a, b) print(a,b) print(c)