【LittleDuck_LeetCodeNote】21 - Merge Two Sorted Lists

更新於 發佈於 閱讀時間約 10 分鐘

【Instagram】 / 【巴哈姆特小屋】 / 【Vocus方格子】 / 【Medium】
喜歡的話就按個愛心或贊助ㄅ。


raw-image

Question and Hints

You are given the heads of two sorted linked lists list1 and list2.

Merge the two lists in a one sorted list. The list should be made by splicing together the nodes of the first two lists.

Return the head of the merged linked list.

Example 1:

raw-image
Input: list1 = [1,2,4], list2 = [1,3,4]
Output: [1,1,2,3,4,4]

Example 2:

Input: list1 = [], list2 = []
Output: []

Example 3:

Input: list1 = [], list2 = [0]
Output: [0]

Constraints:

  • The number of nodes in both lists is in the range [0, 50].
  • 100 <= Node.val <= 100
  • Both list1 and list2 are sorted in non-decreasing order.

First Solution

💡 題目上方的註解是在提示你所使用的程式語言,它的Node結構長怎樣,
所以不用取消註解,不然反而會顯示 NoSuchMethodError
回到解題,這個題目我有點印象,是對LinkedList進行MergeSort。
不過有點久沒寫就忘記了,而且我也沒有用Java寫過。

我最初的想法是,用4個指標,L1、L2不斷向後搜尋,當作陣列搜尋進度。
H1、H2則當作合併時的參考點。
raw-image
如果L1的值大於L2,L2就繼續往後找。
如果L1的值小於或等於L2,就要開始進行合併,合併的步驟如下:
raw-image
  1. 將L1指標向右移,此時L1表示下一個要搜尋的值,H1表示當下要進行合併的值
  2. H1指向L2,進行合併
  3. H2指向H1,表示陣列的頭
  4. H1指標移向L1,做為下一次合併的參考點。
不過這遇到了一些問題,
包含H2參考點仍然會越來越後面,導致最後無法回到陣列的頭,
以及Java沒有指標,而是用Node物件去進行操作的方式讓我有點混亂,
所以很可惜,第一次沒有解出來。
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {

// empty condition.
if(list1 == null && list2 == null)
return list1;
if(list1 == null)
return list2;
if(list2 == null)
return list1;

// Deal with link problem.

ListNode headL1 = new ListNode();
headL1 = list1;
ListNode headL2 = new ListNode();
headL2 = list2;

while(list1 != null || list2 != null){
if(list1.val <= list2.val){
list1 = list1.next;
headL1.next = list2;
headL2 = headL1;
headL1 = list1;
}
else if(list1.val > list2.val){
list2 = list2.next;
}
}
return headL2;
}
}
raw-image
raw-image

⏰ Runtime: ?? ms (?? %)

📦 Memory: ?? MB (?? %)



Upgrade Solution

recursive.

💡 遞迴,神奇的遞迴,OMG。

其實不用特別處理陣列為空的狀況,
此範例是合併在list1,所以兩個都空,回傳哪一個都可以,
list1為空,回傳list2的值,
而無論是list2為空,還是要回傳整理好的陣列,
都是回傳list1。

這個遞迴的運作方式,畫成圖表是長這樣:
raw-image
用遞迴的方式,讓函式本身從每一輪都挑出比較小的那個值,最後遞迴結束後再反向回傳,就能得到由小到大的回傳結果。

神技。Orz
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1!=null && list2!=null){
if(list1.val < list2.val){
list1.next = mergeTwoLists(list1.next,list2);
return list1;
}
else{
list2.next = mergeTwoLists(list1,list2.next);
return list2;
}
}
if(list1==null)
return list2;

return list1;
}
}

⏰ Runtime: 0 ms (100 %)

📦 Memory: 41.8 MB (86.38 %)



Upgrade Solution 2

4 Nodes, like first solution.

💡 這個做法就解決了前面「陣列的頭跑掉」的問題,
而它不是合併在list1或list2,
而是用了一個新陣列prehead依大小吞食兩個陣列。
  • 這邊用prehead作為固定不動,永遠指在最前面的標頭,用cur作為向後追蹤的參考點。
  • 吞食的方式是一個一個吃,只要list1的值比較小,就將list1放進陣列,list2的值比較小,就將list2放進陣列,看是放進哪一個陣列的值,該陣列的指標就向後移一格,同時cur每吃掉一個值就往後移一格。
  • 當一個陣列空了以後,檢查兩個陣列還有沒有值,有就接在cur的後面。
  • 最後回傳固定在陣列頭的prehead。
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode prehead = new ListNode(-1);
ListNode cur = prehead;

while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
cur.next = l1;
l1 = l1.next;
} else {
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}

cur.next = l1 == null ? l2 : l1;
return prehead.next;
}
}

⏰ Runtime: 0 ms (100 %)

📦 Memory: 42.6 MB (20.37 %)




留言
avatar-img
留言分享你的想法!
avatar-img
Steven SHIH的沙龍
6會員
36內容數
以英文和日文歌的翻譯為主,並從「歌曲裡的故事」這個角度去翻譯。畢竟自己只有中文算好而已 :D
Steven SHIH的沙龍的其他內容
2023/07/10
Find the Index of the First Occurrence in a String : 找出haystack在字串中第一次出現的index.
Thumbnail
2023/07/10
Find the Index of the First Occurrence in a String : 找出haystack在字串中第一次出現的index.
Thumbnail
2023/07/10
Remove Element : 在陣列中刪除val後,回傳剩餘的元素個數。
Thumbnail
2023/07/10
Remove Element : 在陣列中刪除val後,回傳剩餘的元素個數。
Thumbnail
2023/07/10
Remove Duplicates from Sorted Array : 將陣列中的重複值移除,並回傳陣列裡的元素總數。
Thumbnail
2023/07/10
Remove Duplicates from Sorted Array : 將陣列中的重複值移除,並回傳陣列裡的元素總數。
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
題目敘述 題目會給定一個鏈結串列 Linked List的頭部結點,要求我們根據索引的奇偶數重新排列。奇數索引的在前,偶數索引的在後。數的時候,從Head節點的索引=1開始數。 例如: 1 -> 2 -> 3 -> 4 -> 5 重新排列為 1 -> 3 -> 5 -> 2 -> 4
Thumbnail
題目敘述 題目會給定一個鏈結串列 Linked List的頭部結點,要求我們根據索引的奇偶數重新排列。奇數索引的在前,偶數索引的在後。數的時候,從Head節點的索引=1開始數。 例如: 1 -> 2 -> 3 -> 4 -> 5 重新排列為 1 -> 3 -> 5 -> 2 -> 4
Thumbnail
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
Thumbnail
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
Thumbnail
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
Thumbnail
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
Thumbnail
Remove Duplicates from Sorted Array : 將陣列中的重複值移除,並回傳陣列裡的元素總數。
Thumbnail
Remove Duplicates from Sorted Array : 將陣列中的重複值移除,並回傳陣列裡的元素總數。
Thumbnail
Merge Two Sorted Lists : 將兩個LinkedList合併成一個新的陣列,並將內容由小到大排序。
Thumbnail
Merge Two Sorted Lists : 將兩個LinkedList合併成一個新的陣列,並將內容由小到大排序。
Thumbnail
Two Sum : 在Array中找出相加後與Target相同的兩個數字,並將他們的index存在新的陣列。
Thumbnail
Two Sum : 在Array中找出相加後與Target相同的兩個數字,並將他們的index存在新的陣列。
Thumbnail
資料集中除了陣列這個外,還有另一個好幫手就是List,它跟陣列很像,我們直接來看一下怎麼用: 它的語法: 1.給予值 (1)單一新增: (2)陣列式新增: 例子: 2.取值 (1)foreach迴圈方式 (2)單一取值 3.取得List有多少個內容值 4.排序 想要反轉就再使用↓ 5.插入 6.複製
Thumbnail
資料集中除了陣列這個外,還有另一個好幫手就是List,它跟陣列很像,我們直接來看一下怎麼用: 它的語法: 1.給予值 (1)單一新增: (2)陣列式新增: 例子: 2.取值 (1)foreach迴圈方式 (2)單一取值 3.取得List有多少個內容值 4.排序 想要反轉就再使用↓ 5.插入 6.複製
Thumbnail
Array 在記憶體中連續分配,而且元素類型是一樣的,長度不變 優點:讀取快,可以使用座標訪問 缺點:新增、刪除慢 記憶體: 📷 範例程式碼: ArrayList 不定長度,在記憶體中連續分配的,元素沒有類型限制,任何元素都是當成object處理,如果是值類型,會有裝箱的操作 優點:讀取快 缺點:
Thumbnail
Array 在記憶體中連續分配,而且元素類型是一樣的,長度不變 優點:讀取快,可以使用座標訪問 缺點:新增、刪除慢 記憶體: 📷 範例程式碼: ArrayList 不定長度,在記憶體中連續分配的,元素沒有類型限制,任何元素都是當成object處理,如果是值類型,會有裝箱的操作 優點:讀取快 缺點:
Thumbnail
Input: head = [1,2,3,4,5], n = 2 Output: [1,2,3,5]
Thumbnail
Input: head = [1,2,3,4,5], n = 2 Output: [1,2,3,5]
Thumbnail
Input: head = [1,2,3,4,5] Output: [3,4,5] 單看列表只是要找中間值,不過給定的資料結構不是陣列,而是鏈結串列。
Thumbnail
Input: head = [1,2,3,4,5] Output: [3,4,5] 單看列表只是要找中間值,不過給定的資料結構不是陣列,而是鏈結串列。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News