[ タイトル ]
リストのヘッドノードの単一ヘッド所与、長さ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 }
出典:左チェンユン先生「プログラマーコードインタビューガイド」