1. 程式人生 > >第六週演算法分析與設計Ⅱ:Merge Two Sorted Lists

第六週演算法分析與設計Ⅱ:Merge Two Sorted Lists

問題描述:

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

題目來自於此處

(注:此題難度雖為easy,但感覺挺典型,很有代表性)

解決方案1(非遞迴):
另起一個結點作為頭結點,同時也作為虛擬結點(所謂的dummy node),這樣可以方便後續處理的統一。當 l1>vall2>val 時,當前結點的next指向 l2 , l2 則指向下一個;反之指向 l1,同時對 l1 做同樣的處理。直到 l1 或者 l2 任一為空,把當前結點的尾部指向非空的那個。

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if(!l1||!l2) return ((l1==l2)?l1:(l1)?l1:l2); //判空的條件。。可能寫的有點複雜
        ListNode* new_head = new ListNode(1); //不知道還有啥初始化的方法
        ListNode* cur_head = new_head;
        while(l1&&l2){
            if(l1->val<=l2->val){
                cur_head->
next = l1; l1 = l1->next; } else{ cur_head->next = l2; l2 = l2->next; } cur_head = cur_head->next; } cur_head->next = (l1==NULL)?l2:l1; return new_head->next; }

時間複雜度O(n),空間複雜度O(1)

解決方案2(遞迴):
遞迴的方法與非遞迴的類似,考慮初始條件及遞迴過程,當 l1>vall2>val 時,那麼將 l1->next 作為新的 l1 進棧;否則 l2->next 進棧;每次遞迴新的函式時都以 ”l1“ 為新的當前連結串列的結點。

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
       if(!l1||!l2) return ((l1==l2)?l1:(l1)?l1:l2); 
        if(l1->val>=l2->val){
            l2->next = mergeTwoLists(l1,l2->next);
            return l2;
        }
        else{
            l1->next = mergeTwoLists(l1->next,l2);
            return l1;
        }
    }

空間複雜度為O(n),時間上的話應該是O(1)

有大神說寫了程式不分析複雜度的是瓜皮。。

相關推薦

演算法分析設計Merge Two Sorted Lists

問題描述: Merge two sorted linked lists and return it as a new list. The new list should be made by s

演算法分析設計Generate Parentheses

問題描述: Given n pairs of parentheses, write a function to generate all combinations of well-formed

演算法分析設計Minimum Size Subarray Sum

演算法描述: Given an array of n positive integers and a positive integer s, find the minimal length of

演算法分析設計 Find Bottom Left Tree Value

問題描述: Given a binary tree, find the leftmost value in the last row of the tree. Example 1:

九周演算法分析設計 Search for a Range

問題描述: Given an array of integers sorted in ascending order, find the starting and ending position

四周演算法分析設計Swap Nodes in Pairs

演算法描述 Given a linked list, swap every two adjacent nodes and return its head. For example,

演算法分析設計動態規劃之矩陣鏈乘

矩陣鏈乘問題 對於給定的n個矩陣,M1, M2 ,…, Mn,其中矩陣Mi 和Mj 是可乘的,要求確定計算矩陣連乘積 ( M1M2 …Mn )的計算次序,使得按照該次數計算 矩陣連乘積時需要的乘法次數最少 1、描述最優解結構 目標: 求出矩陣鏈乘Mi Mi+1 ┅Mj-1 Mj(

C/C++ 演算法分析設計貪心(整數配對)

題目描述 江鳥想到一個有趣的問題:給你N個正整數,你可以將這N個整數按兩個一組的方式成對劃分,當然其中的元素也可以不和其他元素配對劃分。現在的問題是,讓劃分為一對的元素的乘積與未配對的元素相加求和,並且讓和最大。比如:考慮這個集合{0,1,2,4,5,3},如果我們讓{0,3}、{2,5}分別成

C/C++ 演算法分析設計貪心(排隊接水)

題目描述 N個人同時提水到一個水龍頭前提水因為大家的水桶大小不一,所以水龍頭注滿第i(i=1,2,3......N)個人所需要的時間是T(i) 編寫一個程式,對這N個人使他們花費的時間總和最小,並求出這個時間。 例如有三個人a,b,c,用時分別是2,1,3 排隊順序為c,b,a的時候,c要等

C/C++ 演算法分析設計貪心(守望者的逃離)

題目描述 惡魔獵手尤迫安野心勃勃.他背叛了暗夜精靈,率深藏在海底的那加企圖叛變:守望者在與尤迪安的交鋒中遭遇了圍殺.被困在一個荒蕪的大島上。為了殺死守望者,尤迪安開始對這個荒島施咒,這座島很快就會沉下去,到那時,刀上的所有人都會遇難:守望者的跑步速度,為17m/s, 以這樣的速度是無法逃離荒島的

C/C++ 演算法分析設計列舉(分數拆分)

題目描述 現在輸入一個正整數k,找到所有的正整數x>=y,使得1/k=1/x+1/y. 輸入 第一行輸入一個整數n,代表有n組測試資料。 接下來n行每行輸入一個正整數k 輸出 按順序輸出對應每行的k找到所有滿足條件1/k=1/x+1/y的組合 樣例輸入 2

C/C++ 演算法分析設計列舉(二倍的問題)

題目描述 給定2到15個不同的正整數,你的任務是計算這些數裡面有多少個數對滿足:數對中一個數是另一個數的兩倍。比如給定1 4 3 2 9 7 18 22,得到的答案是3,因為2是1的兩倍,4是2個兩倍,18是9的兩倍。 輸入 輸入包括n組測試資料。每組資料包括一行,給出

C/C++ 演算法分析設計貪心(搬運工)

題目描述 搬運工的工作非常辛苦,不僅是因為要費體力,而且幹活要有技巧,不能總是用蠻力。假設你是一名搬運工,給定一個最大載重量為M公斤的卡車和N種食品,有食鹽,白糖,大米等。已知第 i 種食品的擁有Wi 公斤,其商品價值為Vi元/公斤,程式設計確定一個裝貨方案,使得裝入卡車中

C/C++ 演算法分析設計貪心(等價交換)

題目描述 黑龍江的五常大米全國聞名,每年到了秋天,農民們把自己家的大米到集市上去買,但由於五常地區還是一個比較落後的地方,還實行物物交換,即農民用大米換白麵,可以用來蒸饅頭啊!每個集市上大米換白麵的比例並不相等,如何能用最少的大米換到最多的白麵呢?(單位是斤) 輸入 輸

C/C++ 演算法分析設計貪心(今年暑假不AC)

題目描述 “今年暑假不AC?” “是的。” “那你幹什麼呢?” “看世界盃呀,笨蛋!” “@#$%^&*%...” 確實如此,世界盃來了,球迷的節日也來了,估計很多ACMer也會拋開電腦,奔向電視了。 作為球迷,一定想看盡量多的完整的比賽,當然,作為新時代的好青年,

C/C++ 演算法分析設計遞迴(放蘋果)

題目描述 把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。 輸入 第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數M和N,以空格分開。1<

演算法分析課每週練習 Merge k Sorted Lists

題目 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 分析 Merge Sort 裡有合併Sorted List的步驟,

LeetCodeMerge Two Sorted Lists(合併兩個有序連結串列)

題目 Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the fi

演算法分析設計

分析:每次移除一個數,要儘可能使前面的數最小,因為前面的數的權值最大。而刪除一個數,會導致後面緊接著的一個數代替刪除的數的位置。所以在一次移除操作中,從前往後檢查,一旦發現某個數後繼的數更小,則刪除此數。複雜度為o(k*n),可以採用遞迴的方法實現。(然而遞

演算法分析設計134. Gas Station

題目簡介: There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You have a car with an unl