輸入:lists = [ [1,4,5], [1,3,4], [2,6] ],讓你設計乙個程式將鍊錶陣列裡面的所有鍊錶按照公升序的條件合併成乙個鍊錶。輸出:[ 1,1,2,3,4,4,5,6]這道題是乙個困難級別的題目,之前遇到困難題目都是直接跳過,這次主要時看到題目和鍊錶有關,決定試著做一下。
首先看到題目想到的時鍊錶合併的演算法,但是鍊錶合併適用於兩個鍊錶,而題目要求是合併k個鍊錶,所以第一感覺肯定是需要用到乙個常用演算法來幫助完成這道題目。這也是題目難度為困難的原因吧。即考察鍊錶資料結構和鍊錶合併操作,又要考察乙個演算法。然後我就開始尋思是什麼演算法。突然靈光一現,想到陣列排序用的是分治,題目和陣列排序還真有一點相似之處,所以嘗試用分治法來求解。
分治法是將規模較大的問題分解成規模較小的問題進而求解,打眼一看題目,那麼就把鍊錶陣列先分解成[1,4,5],[1,3,4]和[2,6]這兩部分,然後再把左邊分成[1,4,5]和[1,3,4]兩部分,由於這兩部分不能再分解,所以合併這兩個鍊錶,剛好鍊錶的合併操作也是用於兩個鍊錶的。看似問題迎刃而解,但是上手程式設計還是編寫不出來。
當時的想法是按照分治法的方法對陣列進行劃分,left=0,right=length-1,mid=(left+right)/2。直到不能再分解為止,就該對鍊錶兩個鍊錶進行合併,這個時候我反而不知道合併函式的引數是什麼,不知道引數到底是兩個鍊錶還是劃分出來的序號。按道理說應該是兩個鍊錶,但是分治的時候怎麼得到鍊錶呢?最重要的乙個問題是,如果合併完兩個鍊錶,那麼鍊錶陣列的長度就會減一,那麼原本分解好的陣列就全亂了,原本得到的序號都成無效的了,那該怎麼辦。這是我當時最糾結的乙個問題。
把自己編寫**時猶豫的問題記錄下來:1、分治函式的引數怎麼寫,是兩個listnode還是乙個listnode陣列。答:分治函式引數寫listnode陣列,合併鍊錶的函式引數寫兩個listnode。2、分治時兩個鍊錶合併成乙個鍊錶會使得陣列中煉表數量減少,那麼left和right怎麼指示鍊錶?答:合併兩個鍊錶,鍊錶陣列中的鍊錶個數並不減少。
這裡解釋一下為什麼兩個鍊錶合併之後陣列的元素不會減一。因為陣列減乙隻有在這種情況下才會發生,即將兩個鍊錶從陣列中拿出來,合併完之後將這個新的煉表放回陣列中。也就是lists[0] lists[1]合併為lists[0]。然而在合併的時候並沒有發生陣列元素位置的移動。實際上兩個鍊錶的合併也僅僅是結點指標的變動。lists[0]是第乙個鍊錶的頭結點,lists[1]是第二個鍊錶的頭結點。由於合併,lists[0]這個鍊錶加入了lists[1]鍊錶中的結點,lists[1]這個結點已經不是第二個鍊錶的頭結點了,原來那個第二個鍊錶已經不存在了,被合併成乙個鍊錶了即lists[0],但lists[1]作為結點還存在陣列中,只不過它現在表示的鍊錶跟原來的鍊錶不一樣了,它表示的鍊錶成了lists[1]鍊錶的一部分。所以總的來說陣列的長度並沒有改變。其實也可以這麼理解:鍊錶陣列中放的僅僅是每個鍊錶的頭結點,合併後頭結點是沒有變化的,即他們的個數沒有少,但是它們所表示的鍊錶卻發生了變化。第乙個頭結點表示合併後的新鍊錶,第二個頭結點表示新煉表中的一部分,因為第二個結點在合併的時候作為乙個結點被加入到新鍊錶中,由於它後面面鏈有結點,所以它所表示的就是新煉表中的乙個子鍊錶,但實際上它已經沒有意義了。
分治法**如下:
class solution
public listnode divide(listnode lists, int left, int right)
return merge;
}public listnode mergetwolinks(listnode l1, listnode l2) else
}cur.next = l1==null ? l2 : l1;
return tou.next;
}}
23 合併K個公升序鍊錶
給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。示例 1 輸入 lists 1,4,5 1,3,4 2,6 輸出 1,1,2,3,4,4,5,6 解釋 鍊錶陣列如下 1 4 5,1 3 4,2 6 將它們合併到乙個有序鍊錶中得到。1 1 2 3 ...
23 合併K個公升序鍊錶
題目描述 給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。示例 1 輸入 lists 1,4,5 1,3,4 2,6 輸出 1,1,2,3,4,4,5,6 解釋 鍊錶陣列如下 1 4 5,1 3 4,2 6 將它們合併到乙個有序鍊錶中得到。1 1...
23 合併K個公升序鍊錶
給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。示例 1 輸入 lists 1,4,5 1,3,4 2,6 輸出 1,1,2,3,4,4,5,6 解釋 鍊錶陣列如下 1 4 5,1 3 4,2 6 將它們合併到乙個有序鍊錶中得到。1 1 2 3 ...