Java合并兩個(gè)及以上有序鏈表的示例詳解
題目一:合并兩個(gè)有序鏈表

題目一思路
設(shè)置兩個(gè)指針,一個(gè)指針(t1)指向l1鏈表頭,另外一個(gè)指針(t2)指向l2鏈表頭。
首先判斷l(xiāng)1和l2的第一個(gè)元素,誰(shuí)小,誰(shuí)就是最后要返回的鏈表的頭節(jié)點(diǎn),如果l1和l2的第一個(gè)元素相等,隨便取哪個(gè)都可以。
這樣,我們就設(shè)置好了要返回鏈表的頭節(jié)點(diǎn),假設(shè)頭節(jié)點(diǎn)是head,
依次移動(dòng)t1和t2指針,誰(shuí)小,誰(shuí)就接入進(jìn)來(lái)。依次操作,直到兩個(gè)鏈表都遍歷完畢為止。
此外,有個(gè)顯而易見(jiàn)的結(jié)論:如果l1和l2有一個(gè)鏈表為空,則返回那個(gè)不為空的鏈表即可
題目一完整代碼
public class LeetCode_0021_MergeTwoSortedLists {
public static class ListNode {
public int val;
public ListNode next;
}
public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null || l2 == null) {
// 如果任何一個(gè)鏈表為空,那么直接返回另外一個(gè)鏈表即可
return l1 == null ? l2 : l1;
}
// 誰(shuí)小誰(shuí)作為頭
ListNode head = l1.val > l2.val ? l2 : l1;
// t1 和 t2 表示l1和l2下一個(gè)要遍歷的位置
ListNode t1 = head == l1 ? l1.next : l1;
ListNode t2 = head == l2 ? l2.next : l2;
ListNode cur = head;
while (t1 != null || t2 != null) {
if (t1 == null) {
// l1鏈表已經(jīng)到頭,剩下只需要把l2鏈表接入進(jìn)來(lái)即可
cur.next = t2;
t2 = t2.next;
cur = cur.next;
continue;
}
if (t2 == null) {
// l2鏈表已經(jīng)到頭,剩下只需要把l2鏈表接入進(jìn)來(lái)即可
cur.next = t1;
t1 = t1.next;
cur = cur.next;
continue;
}
// l1和l2都沒(méi)有到頭,那么誰(shuí)小誰(shuí)接入進(jìn)來(lái)即可。
if (t1.val > t2.val) {
cur.next = t2;
t2 = t2.next;
} else {
cur.next = t1;
t1 = t1.next;
}
cur = cur.next;
}
return head;
}
}
題目二:合并多個(gè)有序鏈表

題目二關(guān)鍵思路
準(zhǔn)備一個(gè)小根堆,并把每個(gè)鏈表的頭節(jié)點(diǎn)加入到小根堆中,此時(shí),小根堆堆頂彈出的節(jié)點(diǎn)一定是最后生成鏈表的頭節(jié)點(diǎn)。
假設(shè)鏈表為:L1,L2...LN
第一步,先將L1,L2...LN的頭節(jié)點(diǎn)L1H,L2H...LNH加入小根堆
第二步,從小根堆堆頂彈出一個(gè)元素,作為最后鏈表的頭節(jié)點(diǎn)。
第三步,第二步中彈出節(jié)點(diǎn)所在的鏈表假設(shè)是i號(hào)鏈表,那么就找彈出節(jié)點(diǎn)的下一個(gè)位置(假設(shè)為X)再和小根堆堆頂元素比較:
如果X比堆頂元素大,則堆頂元素彈出,X進(jìn)入小根堆
如果X比堆頂元素小,則直接不需要進(jìn)入堆頂,作為結(jié)果鏈表
題目二完整代碼
public class LeetCode_0023_MergeKSortedLists {
public static class ListNode {
int val;
ListNode next;
}
public static ListNode mergeKLists(ListNode[] lists) {
if (null == lists || lists.length == 0) {
return null;
}
if (1 == lists.length) {
return lists[0];
}
// 小根堆
PriorityQueue<ListNode> queue = new PriorityQueue<>(Comparator.comparingInt(o -> o.val));
for (ListNode list : lists) {
if (null != list) {
queue.add(list);
}
}
ListNode res = queue.poll();
ListNode head = res;
while (!queue.isEmpty()) {
if (res != null) {
ListNode n = res.next;
if (n == null) {
res.next = queue.poll();
res = res.next;
} else if (n.val > queue.peek().val) {
res.next = queue.poll();
res = res.next;
queue.add(n);
} else {
res = res.next;
}
}
}
return head;
}
}到此這篇關(guān)于Java合并兩個(gè)及以上有序鏈表的示例詳解的文章就介紹到這了,更多相關(guān)Java合并有序鏈表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea使用pagehelper實(shí)現(xiàn)后端分頁(yè)功能的步驟詳解
這篇文章主要介紹了idea使用pagehelper實(shí)現(xiàn)后端分頁(yè)功能的步驟,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Spring Boot Filter 過(guò)濾器的使用方式
這篇文章主要介紹了Spring Boot Filter 過(guò)濾器的使用方式,文章通過(guò)圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
java實(shí)現(xiàn)去除ArrayList重復(fù)字符串
本文主要介紹了java實(shí)現(xiàn)去除ArrayList重復(fù)字符串,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09
Mybatis Plus 實(shí)現(xiàn)批量插入的示例代碼
本文主要介紹了Mybatis Plus 實(shí)現(xiàn)批量插入的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之背包問(wèn)題
背包問(wèn)題是一個(gè)非常典型的考察動(dòng)態(tài)規(guī)劃應(yīng)用的題目,對(duì)其加上不同的限制和條件,可以衍生出諸多變種,若要全面理解動(dòng)態(tài)規(guī)劃,就必須對(duì)背包問(wèn)題了如指掌2022-02-02
Java8特性之用Stream流代替For循環(huán)操作詳解
這篇文章主要介紹了Stream流代替For循環(huán)進(jìn)行輸出,這樣可以使代碼更簡(jiǎn)潔,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-09-09
微信小程序獲取手機(jī)號(hào),后端JAVA解密流程代碼
這篇文章主要介紹了微信小程序獲取手機(jī)號(hào),后端JAVA解密流程的代碼,幫助大家更好的利用Java開(kāi)發(fā),感興趣的朋友可以了解下2020-09-09

