LeetCode 21 合併兩個有序鍊錶

2021-10-03 07:41:54 字數 1214 閱讀 1054

這次題目很簡單,就是將兩個有序鍊錶合併成乙個有序鍊錶。

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。 

示例:輸入:1->2->4, 1->3->4

輸出:1->1->2->3->4->4

這個題目的思路,一開始,我想到的是在乙個鍊錶上合併另乙個鍊錶,但是有乙個問題,就是不知道從哪個鍊錶開始,因為兩個鍊錶都有可以。所有應該是自己新建乙個鍊錶,將兩個鍊錶合併進來才對。說是自己新建乙個鍊錶,其實只需要自己新建乙個鍊錶的頭就可以了。其它的資料都從兩個鍊錶裡面取就即可,最後返回的時候,將表頭跳過即可。

其中還是有很多細節需要考慮:是先合併乙個,還是一口氣合併兩個。答案是只能先合併乙個,第二個剩下的部分就可以直接接上就可以了。這些就實話,我在自己思考的時候很難想得全面,一不小心就到了死胡同裡面,明明**其實可以很簡單。

var

mergetwolists

=function

(l1, l2)

else

head = head.next;

}// 將剩下的鍊錶接上去

head.next = l1 ==

null

? l2 : l1;

return l0.next;

};

除了這種簡單的合併思路之外,還有另一種思路,這也是我為什麼要寫這篇文章的理由。就是使用遞迴函式,在不考慮空間時間的情況下,遞迴的**是最簡單的。

那麼理解這種思路呢?其實因為兩個鍊錶都是有序的,所有兩個鍊錶最小的元素一定是在兩個鍊錶的第乙個元素,也就是說,新鍊錶的頭一定是兩個鍊錶的第乙個元素其中的乙個。找到之後,就在兩個鍊錶裡面去掉它,這樣,我就又有兩個新的鍊錶,繼續找這兩個新的鍊錶裡面頭最小的那乙個,它又肯定是新鍊錶的下乙個元素,就這樣遞迴,我們就可以一直找到這兩個鍊錶都為空的時候,那新鍊錶也就生成了。

這個考慮的前提是區域性必須與整體是相似的,才能使用遞迴。

var

mergetwolists

=function

(l1, l2)

else

if(l2 ==

null

)else

if(l1.val < l2.val)

else

}

遞迴的解法不能保證是最快的,但它一定是**量最小的。也是最難理解的。

LeetCode 21合併兩個有序列表

將兩個公升序鍊錶合併為乙個新的公升序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4初始解法 這個問題轉換為經典的merge排序中的merge過程.merge排序中merge操作即是將兩個有序子陣列合併成乙個陣列,需要考慮比較過程...

leetcode21 合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 思路 每次判斷兩個鍊錶的頭部小的數值,訪問小的,並讓該鍊錶往後移動。注意 注意鍊錶走完,為空的情況即可。遇到的問題 一開始不太理解鍊錶,返回e...

LEETCODE 21 合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4c 第一遍將 相等 的這個else分支寫錯了,主要錯誤在於,next指標指向下乙個的這條語句寫到了後面,導致節點自己指向自己,造成了超時錯誤 執...