説明
2 つの増加するリンク リストを入力し、1 つのリンク リストの長さは n で、2 つのリンク リストをマージし、新しいリンク リスト内のノードが増分的にソートされるようにします。
データ範囲: 0 ≤ n ≤ 1000、-1000 ≤ ノード値 ≤ 1000
要件: 空間計算量 O(1)、時間計算量 O(n)
たとえば、{1,3,5}、{2,4,6} が入力された場合、結合されたリンク リストは {1,2,3,4,5,6} となるため、対応する出力は {1,2 となります。 ,3, 4,5,6} の変換プロセスを次の図に示します。
または、{-1,2,4}、{1,3,4} と入力すると、マージされたリンク リストは {-1,1,2,3,4,4} となるため、対応する出力は {-1,1 , 2,3,4,4} の変換プロセスを次の図に示します。
例1
入力:
{1,3,5}、{2,4,6}
戻り値:
{1,2,3,4,5,6}
例 2
入力:
{}、{}
戻り値:
{}
例 3
入力:
{-1,2,4}、{1,3,4}
戻り値:
{-1,1,2,3,4,4}
本旨:
まず、2 つのリンク リストの一方が空かどうかを判断する必要があります。空の場合は、もう一方のリンク リストを直接 (何もせずに) 返します。次にヘッダーを初期化します。最初のリンク リストの最初の値が 2 番目のリンク リストの最初の値以下の場合、ヘッダーは最初のリンク リストの最初の値に初期化され、それより大きい場合はヘッダーが初期化されます。 2 番目のリンク リストに初期化されます。 の最初の値、次のキー ポイント: 後で返せるように、メーター ヘッダーの最初のポインタの位置を必ず保存してください。!!
次のステップは、マージ操作を実行することです。ループの条件は、最初のリンク リストまたは 2 番目のリンク リストのいずれかがリンク リストの最後に到達すると停止し、マージ操作は次の条件と一致します。マージソートの考え方なので、ここでは多くは言いません。わかりません。分からない友達は下に降りて自分で見直してください〜。完全なコードは次のとおりです。
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function Merge(pHead1, pHead2)
{
// write code here
let p1,p2=null;
let pnew=null;
p1=pHead1;
p2=pHead2;
// 判断:如果有一个已经为空了就返回另外一个
if(p1===null) {
return p2;
}
if(p2===null)
{
return p1;
}
if(p1.val<=p2.val) {
pnew=p1;
p1=p1.next;
}
else {
pnew=p2;
p2=p2.next;
}
let res=pnew;
while(p1!==null&&p2!==null) {
if(p1.val<=p2.val) {
pnew.next=p1;
p1=p1.next;
}
else {
pnew.next=p2;
p2=p2.next;
}
pnew=pnew.next;
}
if(p1===null) {
pnew.next=p2;
}
if(p2===null) {
pnew.next=p1;
}
return res;
}
module.exports = {
Merge : Merge
};