演算法 鍊錶的歸併排序

2021-10-24 02:28:45 字數 1000 閱讀 5458

複雜度分析:

設定兩個指標,乙個步長為1, 乙個步長為2,當快指標到達尾結點時,慢指標指向中間結點,時間複雜度為o(n);

平分為左鍊錶l1和右鍊錶l2,遞迴**,直到鍊錶為空或者只有乙個結點;

將鍊錶l2的每個結點插入到鍊錶l1中,時間複雜度為o(m+n),m、n分別為兩條鍊錶的長度。

畫出遞迴樹,可知總的時間複雜度為o(n * lgn)。

# include using namespace std;

struct node

node() };

struct list };

node* merge(node* newleft, node* newright)

else

tail = newlist;

tail->next = null;

while (newleft != null || newright != null)

else if (newright == null)

else if (newleft->data < newright->data)

else

} return newlist;

}node* part(node* head)

node* left = head;

node* right = slow->next;

slow->next = null;

return right;

}node* listmergesort(node* head)

int main()

cout << endl;

node* newhead = listmergesort(list.head); //這裡把list的頭節點直接進去了2333333,不優雅.。。。

node * temp;

for (int i = 0; i < 10; i++)

cout << endl;

}

鍊錶歸併排序

include include include include include using namespace std typedef int type typedef struct nodetag node node build type a,int n pnode pnext null retu...

鍊錶歸併排序

主要思路 1 如果為null或者只有乙個節點那麼直接返回 2 將鍊錶分成兩部分,分別進行排序,形成兩個有序鍊錶 3 將兩個有序鍊錶合併 void merge sort struct node list void split struct node head,struct node lista,str...

鍊錶 歸併排序

時間複雜度o nlogn 空間複雜度o 1 include include 定義鍊錶 typedef struct listnode linklist linklist head null 建立鍊錶 linklist createlist int arr,int len rear next null...