合併兩個升序鏈表

intNode   *merge(intNode   *a,intNode   *b)   
      
{     

        intNode   
*h   =   a,*p,*q;   //h 爲合併後的連表,p 爲 a的指針, q是b的指針;
                while(b)   
          
{    
         
for   (p   =   h;  p   &&   p->val<b->val;   q   =   p,   p   =   p->next);   
                      
if   (p   ==   h)   
                h
=b;  
             
else  
                q
->next=p  ; 
                          q   
=   b;  
             b   
=   b->next; 
            q
->next=p   ;
            }
   
                
return   h;   
      }
    

 

看循環的第一部分。如果注意到循環條件括號後的分號,我們能夠確認這是一個空循環。但是仔細研究該循環,發現該循環又有非常重要的用途。用自然語言描述該循環條件,應該是:讓指針p指向鏈表h,當鏈表p的當前表元不是鏈表尾,且鏈表p的當前表元的成員val小於鏈表b的當前表元的成員val時,讓指針q指向鏈表p的當前位置,鏈表p的當前表元順序向後移動一次。     (這也就是在鏈表p(h)中找到第一個表元,該表元的成員val大於或等於鏈表b的當前表元的成員val。)       如果鏈表p的當前表元是鏈表尾了,那意味着什麼?這種情況說明鏈表b的當前表元應該插入到鏈表p(h)的末尾,因爲兩個鏈表已經是升序排列的了. 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章