問題描述 :
在 o(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。
示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
示例 2:
輸入: -1->5->3->4->0
輸出: -1->0->3->4->5
可使用以下**,完成其中的sortlist函式,其中形參head指向無頭結點單鏈表。
#include
using namespace std;
struct listnode
int val;
listnode *next;
listnode() : val(0), next(null) {}
listnode(int x) : val(x), next(null) {}
listnode(int x, listnode *next) : val(x), next(next) {}
class solution listnode *createbytail()
listnode *head;
listnode *p1,*p2;
int n=0,num;
int len;
cin>>len;
head=null;
while(n>num)
return head;
void displaylink(listnode *head)
listnode *p;
p=head;
cout<<"head-->";
while(p!= null)
cout<<"tail\n";
int main()
listnode* head = createbytail();
head=solution().sortlist(head);
displaylink(head);
return 0;
輸入說明 :
首先輸入鍊錶長度len,然後輸入len個整數,以空格分隔。
輸出說明 :
輸出格式見範例
輸入範例 :
5-1 5 3 4 0
輸出範例 :
head–>-1–>0–>3–>4–>5–>tail
思想:歸併排序
快慢指標找到鍊錶中間節點,然後按照這個中間節點劃分為左右兩部分
最後合併左右兩部分 */
#include
#include
using
namespace std;
struct listnode
listnode
(int x)
:val
(x),
next
(null)}
;class
solution
pre-
>next =
null
;//遞迴左右子表
listnode *left =
sortlist
(head)
; listnode *right =
sortlist
(slow)
;//合併結果
return
mergetwolists
(left,right);}
//合併兩個有序鍊錶,使合併後的鍊錶任然有序
listnode *
mergetwolists
(listnode *left,listnode *right)
else
pre = pre-
>next;
}//左表還有剩餘節點
if(left)
//右表還有剩餘結點
if(right)
return dummy.next;}}
;listnode *
createbytail()
return head;
}void
displaylink
(listnode *head)
cout<<
"tail\n";}
intmain()
leetcode 14 合併k個排序鍊錶
合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 在k個鍊錶中找到乙個比較節點,然後把k個鍊錶分成兩部分,一部分都比比較節點小,一部分都比比較節點大,然後遞迴。但是時間太慢了,原因乙個是,找到的比...
Leetcode 148 排序鍊錶
在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5在陣列儲存下的歸併排序,需要借出輔助空間完成,而鍊錶儲存的歸併排序,不需要借助輔助空間,直接在原來的鍊錶上進行操作,...
LeetCode 148 排序鍊錶
在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3輸出 1 2 3 4示例 2 輸入 1 5 3 4 0輸出 1 0 3 4 5歸併這裡我感覺有點不符合題意 不符合常數空間 如果是快排的話呢,交換節點還是很麻煩的,所以快排交換值了 癱.jpg cl...