「コーディングインタビューガイド」 - 方法で再結合した一本鎖の半分の領域について

[ タイトル ]

  リストのヘッドノードの単一ヘッド所与、長さNのリストは、Nが偶数である場合、最初のN / 2のノードが左領域をカウントし、N / 2のノードが右領域をカウントし、Nが奇数である場合、次いで、最初のN / 2のノードが左領域をカウントし、N / 2 + 1のノードが右領域を計数しました。

  左右の領域に左から示さL1 - > L2 - >···、R1として示さ右右領域に左から - > R2 - > ...、単一のリストL1を設定するように調整 - > R1 - > L2 - > R2 - > ...フォーム

  例えば、1 - >ヌル - > nullは、1に調整します

    > 2 - - >ヌル1 - > 2 - 1に調整>ヌル、

    > - 2 - > 3 - >ヌル1 - > 2 - > 3 - 1に調整>ヌル、

    > 3 - - > 2 - > 4 - >ヌル1 - > 2 - > 3 - > 4 - 1に調整>ヌル、

    > 3 - - > 2 - > 4 - > 5 - >ヌル1 - > 2 - > 3 - > 4 - > 5 - 1に調整>ヌル、

    > 4 - - > 2 - > 5 - > 3 - > 6 - >ヌル1 - > 2 - > 3 - > 4 - > 5 - > 6 - 1に調整>ヌル、

俺の:

1つの     公共 ボイドRELOCATE(ノードヘッド)
 2      {
 3。       IF(ヘッド== NULL || head.next == NULL 4。       {
 5。         復帰;
 6       } 。7          = getMid(ヘッド)左ノード;   // getMidは、中間ノードを返します8          ノードの右= left.next;
 9          left.next = NULL ;
 10          左= ヘッド;
 11 12であり、一方(!left.next = ヌル13です        {

14 ノードTEMP = 右、 15 右= right.next; 16 temp.next = left.next; 17 left.next = TEMP; 18れる 左= temp.next; 19 }       left.next =右; // 右領域左側の領域の長さよりも常に短い長さ、左側頭部領域よりも右場合、その部分を直接リストの長い末端に結合する24 } 25 26であるパブリック・ノードgetMid(ノードヘッド) 27 { 28 ノードTEMP = ヘッド、 29 ノードプリ= ヘッド; 30

次のノード= ヘッド、 31は 、一方(!next.next = ヌル!&& next.next.next = ヌル32 { 33は、 TEMP = プレ; 34は、 予め= pre.next; 35 次= next.next.next; 36 } 37 [ リターン(next.next == NULL?)TEMP:事前; // Nが一時返さ奇数である場合、偶数プリリターンで 38 }

 

左教師:

1つの     公共 ボイドRELOCATE(ノードヘッド)
 2      {    
 3。         IF(ヘッド== NULL || head.next == NULL 4。         {
 5              リターン;
 6          }
 。7          ノードMID = ヘッドと、
 8          ノード右= head.next;        // もし中間ノードは、一般的な意味を見つけることであり、それはここで右ヘッド=であるべきである
。9          ながら(!right.next = ヌル!&& right.next.next = ヌル10          {
 11。              mIDを= mid.next;
 12であります             右= right.next.next。
13          }
 14          右= mid.next。
15          mid.next = NULL ;
16          mergeLR(頭、右)。
17      }
 18  
19      公共 ボイド mergeLR(ノードは、左ノード右)      // 合并左右半区
20      {
 21          ノード次= NULL ;
22          一方(left.next!= NULL 23          {
 24              次= right.next。
25             = right.next left.next;
 26は              = left.next 右;
 27              =左right.next;
 28              右= 次に;
 29          }
 30          left.next =右;     // 右半分の領域の長さは常に左より小さいためすべての直接テール領域の右半分の数にリンクされている地区、
31      }

 

 

出典:左チェンユン先生「プログラマーコードインタビューガイド」

おすすめ

転載: www.cnblogs.com/latup/p/10991435.html