每日一題(4)

2021-08-22 04:46:34 字數 2426 閱讀 7186

思路:

先用快慢指標找到鍊錶的中點,然後翻轉鍊錶後半部分,再和前半部分組合。

注意:

把鍊錶分成兩半時,前半段的尾節點要置為null,翻轉鍊錶時也要把尾節點置為null。

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

//此時的slow即為中間節點

//將中間節點前後拆成兩條鏈

listnode *

list

=slow->next;

slow->next=

null;

//逆置中間節點後的節點

listnode *node=

null;

listnode *cur=

list;

while(cur)

list

=node;

//將兩個鍊錶合併

因為題目要求複雜度為o(nlogn),故可以考慮歸併排序的思想。

時間複雜度o(nlogn)空間複雜度 o(1)

歸併排序的一般步驟為:

將待排序陣列(鍊錶)取中點並一分為二;

遞迴地對左半部分進行歸併排序;

遞迴地對右半部分進行歸併排序;

根據題目要求,可以劃分為三個小問題:

找到鍊錶中點

寫出mergetwolist函式,即如何合併鍊錶。

寫出sortlist函式,通過遞迴實現

用快慢指標找出中點,作為根,中點左右兩邊分別遞迴的構建二叉樹。

最初使用跟sort list一般的方法:乙個鏈**成兩個鏈,發現有錯誤。原因是有中點需要去掉,跟劃分鏈不完全一致了。

最好是使用乙個begin指標指示第乙個元素,end指標指示最後乙個元素的下乙個位置(即左閉右開空間),很方便的就構建起平衡二叉樹。

元素個數為奇數的構建平衡二叉查詢樹:

元素個數為偶數的構建平衡二叉查詢樹:

每日一題 day4

基礎題 1 判斷兩個鍊錶是否相交,若相交,求交點 假設鍊錶不帶環 思路 2 判斷兩個鍊錶是否相交,若相交,求交點 假設鍊錶可能帶環 思路 兩個鍊錶帶環可分為兩種情況 1.乙個帶環,乙個不帶環 這種情況是不會有交點的 2.兩個都帶環 分析 入口點相同時,分別讓兩個鍊錶從入口點處斷開,則轉換成了兩個不帶...

每日一題 1

題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...

每日一題2018 3 21

leetcode 2 模擬十進位制運算考察單鏈表基本操作。題無難點,個人基礎需要提高。definition for singly linked list.struct listnode class solution while p while q if shi val s next null ret...