複雜度分析:
設定兩個指標,乙個步長為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...