思路:
先用快慢指標找到鍊錶的中點,然後翻轉鍊錶後半部分,再和前半部分組合。
注意:
把鍊錶分成兩半時,前半段的尾節點要置為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...