2つの順序付けられた単一リンクリストをマージするためのソートアルゴリズム

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;
}

おすすめ

転載: blog.csdn.net/honeylife/article/details/100152075