合併兩個有序鍊錶(力扣:21)
合併k個排序鍊錶(力扣:23)
分隔鍊錶(力扣:86)
鍊錶節點:
public class listnode
}
題目
將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。
分析合併兩個有序鍊錶,可以使用2種方式來實現:
遞迴法:分別判斷l1和l2的值,當它們任意乙個為空時,返回另乙個;如果不為空,則判斷l1的值如果小於l2的值,將l1的next等於遞迴的返回鍊錶,否則,將l2的next等於遞迴的返回列表。
遍曆法:新建乙個空鍊錶,比較l1和l2的當前節點,並且將值較小的新增到新建鍊錶的尾部,一直到兩個鍊錶出現null為止;這時,將另乙個不為null的鍊錶新增到新鍊錶的尾部即可。
**實現:遞迴
/**
* 21. 合併兩個有序鍊錶
* @param l1
* @param l2
* @return
*/public listnode mergetwolists(listnode l1, listnode l2)
if (l2 == null)
if (l1.val < l2.val)else
}
**實現:遍歷/**
* 21. 合併兩個有序鍊錶
* @param l1
* @param l2
* @return
*/public listnode mergetwolists2(listnode l1, listnode l2) else
prev = prev.next;
}prev.next = l1 == null ? l2 : l1;
return dummy.next;
}
題目
合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。
分析方法二:使用折半合併方案,每次合併陣列中的兩個元素,一次遍歷完成會減少1/2元素,然後繼續,直到只剩乙個元素位置,合併完成。該方法是方法一的優化,時間複雜度為o(nlogk)。
方法三:使用輔助佇列來實現。將每個鍊錶中的頭元素都放入優先佇列中,則該佇列中的元素已排好序了,然後建立乙個新鍊錶(第乙個元素為空,作為結果鍊錶),每次都用優先佇列中彈出乙個元素,放入新煉表中,如果當前元素的next不為空,則繼續進入佇列,當隊列為空時,結束整個過程。時間複雜度為o(kn×logk)。
**實現:方法一
/**
* 21. 合併兩個有序鍊錶
* @param l1
* @param l2
* @return
*/public listnode mergetwolists(listnode l1, listnode l2)
if (l2 == null)
if (l1.val < l2.val)else
}/**
* 23. 合併k個排序鍊錶
* @param lists
* @return
*/public listnode mergeklists(listnode lists)
int n = lists.length;
while (n > 1)
});for (int i=0;i題目
給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。
你應當保留兩個分割槽中每個節點的初始相對位置。
示例:輸入: head = 1->4->3->2->5->2, x = 3
輸出: 1->2->2->4->3->5
分析該問題的關鍵是,遍歷原鍊錶,將原鍊錶拆分成2個部分,一部分是小於x的,另一部分是大於等於x的,然後將連個拆分後的鍊錶合併,最終得到結果。
**實現/**
* 86. 分隔鍊錶
* @param head
* @param x
* @return
*/public listnode partition(listnode head, int x) else
}s.next = big.next;
return small.next;
}
演算法 鍊錶 鍊錶分隔(鍊錶劃分)
給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3 輸出 1 2 2 4 3 5 兩個臨時頭結點和尾節點,組成兩個鍊錶,分別存放較小和較大節點 完成後...
分隔鍊錶(鍊錶 LeetCode)
題目鏈結 給你乙個鍊錶和乙個特定值 x 請你對鍊錶進行分隔,使得所有小於 x 的節點都出現在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3 輸出 1 2 2 4 3 5維護兩個鍊錶,乙個鍊錶儲存比x小的結點,另乙個鍊錶儲...
LeetCode 分隔鍊錶
給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3 輸出 1 2 2 4 3 5 思路分析 本題主要就是一句節點的val的大小進行分類,小於x的放一邊...