合併兩個有序單鏈表(Java)
阿新 • • 發佈:2019-01-06
思想:
準備兩個連結串列l1和l2:
- 判斷是否有連結串列為空:如果l1為空,則不用比較直接返回l2,如果l1為空,則直接返回l2;
- 比較l1和l2節點,選出最小的那個節點,將該節點設為合併後的連結串列的head(頭)節點,同時將指向該節點的l1或l2後移,方便接下來的比較;
- 設定一個變數temp指向head節點,用於之後連線其它節點;
- 再比較l1和l2節點,同樣選出小的那個節點,將該節點設為合併後的連結串列的第二個節點,用temp.next表示該節點,同時將指向該節點的l1或l2後移;
- 重複比較l1和l2節點,直到l1或l2節點為null;
- 此時,必定有一個連結串列中的所有節點都放入了新連結串列中,只要將另一個連結串列中的剩餘的所有節點都接到新連結串列之後就可以了。
1.單鏈表的節點的結構:
public class ListNode {
int val;//節點的屬性,儲存節點的值
ListNode next;//節點的屬性,儲存了下一個節點的地址
ListNode(int x) { val = x; }
}
2.合併連結串列的方法:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = null;
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
if (l1.val <= l2.val) {//如果l1節點的值小於等於l2節點的值,由於這兩個連結串列是有序的,所以合併後最小的節點(head節點)就是它們兩者中的小者
head = l1;
l1 = l1.next;//後移,用於繼續比較選出接下來最小的節點
}else {
head = l2;
l2 = l2.next;
}
ListNode temp = head;
//接著比較兩個連結串列,對兩個連結串列中的最小的節點進行比較選出最小的,也就是合併後的第二小的節點,迴圈知道有一個連結串列為空
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
temp.next = l1;
l1 = l1.next;
}else {
temp.next = l2;
l2 = l2.next;
}
temp = temp.next;
}
if (l1 == null) {
temp.next = l2;
}
if (l2 == null) {
temp.next = l1;
}
return head;
}
}