很經典的一道題,既然是面試拿出來,肯定是要求 o(n * logn) 的時間複雜度了。
另有經典:鍊錶 k 個節點為一組進行逆序:
遞迴,可以用快排或者歸排 , 這裡使用歸排,先用快慢指標法找到中間節點,然後斷開連線,分治處理兩個部分,最後合併。不像陣列歸排,這裡只用到了乙個 dummy 指標 (臨時頭節點,關於鍊錶的題目經常使用),所以空間複雜度只有遞迴棧 o(logn). 要注意的是 merge(node1, node2) 呼叫時傳入的是遞迴返回的兩個節點,而不是 first 和 slow.next 兩個最初的頭結點。
public
class
linknodesorttest
}private
static node sortlist
(node first)
node secondfirst = slow.next;
// 斷開和後面的連線
slow.next = null;
// 注意返回值的使用,函式返回的是排序後的鍊錶首節點
node node =
sortlist
(first)
; node node1 =
sortlist
(secondfirst)
;return
merge
(node, node1);}
private
static node merge
(node node1, node node2)
else
tail = tail.next;
} tail.next =
(node1 == null ? node2 : node1)
;return dummy.next;
}// 自測**
public
static
void
main
(string[
] args)
}}
面試題 排序鍊錶的合併
舉例 兩個鍊錶的情況可能有以下幾種,一是其中乙個鍊錶為空,二是兩個鍊錶都為空,三是兩個鍊錶都不為空。如果是兩個鍊錶都為空的話,那直接就將返回。下面針對存在不空鍊錶的情況做出分析。1,如果是其中乙個鍊錶為空的話,直接返回另一鍊錶的頭結點就行了。2,如果是兩個鍊錶都不為空的話,這個情況就比前兩種情況複雜...
微軟面試題
題目 小明和小強都是張老師的學生,張老師的生日是m月n日,2人都知道張老師的生日是下列10組中的一天,張老師把m值告訴了小明,把n值告訴了小強,張老師問他們知道他的生日是那一天嗎?3月4日 3月5日 3月8日 6月4日 6月7日 9月1日 9月5日 12月1日 12月2日 12月8日 小明說 如果我...
微軟面試題
fly.c4 推薦您必看!六.演算法題 說明 這些題就不是什麼花樣了,考的是你的基礎知識怎麼樣。再聰明而沒有實學的人都將會被這些題所淘汰。1.鍊錶和陣列的區別在 2.編寫實現鍊錶排序的一種演算法。說明為什麼你會選擇用這樣的方法?3.編寫實現陣列排序的一種演算法。說明為什麼你會選擇用這樣的方法?4.請...