2つの順序付けられた単一リンクリストをマージするためのソートアルゴリズム
分析
順序付き片側リストの場合、最初に最初のリンクリストlist1をベンチマークとして使用し、それをループ内のリンクリストlist2と比較します。
-
最初のリンクリストが最初に終了する場合は、list1の後の2番目のリンクリストの後ろの部分を直接接続します。
-
2番目のものが最初に終了する場合、トラバースする必要はありません。直接終了します。
そうすることで、時間計算量はlist1の長さ(O(n))になります。
もちろん、壊れたリンクリストが準ベースの場合、時間計算量は最速です。
コード
// 合并两个 有序的单链表,让其有序
LinkList MARGELIST(LinkList l1,LinkList l2){
LinkList list ,p,q,r,s;
q=l2;
list =l1;
p=list;
r=p;
while (p!=NULL&&q!=NULL) {
if (p->data<q->data){
r=p;
p=p->link;
}else{
s=q;
q=q->link;
s->link=p;
// 这里为什么这么写,主要是为了解决list1的第一个结点
// 就比list2的第一个结点大的时候
if (r==p) {
r=s;
list=r;
}else{
r->link=s;
r=s;
}
}
}
if (q!=NULL){
r->link=q;
}
return list;
}