鍊錶合併 分隔鍊錶等相關常見演算法整理

2021-10-07 07:35:30 字數 2161 閱讀 7983

合併兩個有序鍊錶(力扣: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的放一邊...