2つの順序付けられたリンクリストを新しい順序付けされたリンクリストに結合して戻ります。新しいリンクリストは、指定された2つのリンクリストのすべてのノードを接合することによって構成されます。
例:
入力:1-> 2-> 4、1-> 3-> 4
出力:1-> 1-> 2-> 3-> 4-> 4
public class Solution1 {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}
反復と再帰の両方で問題を解決できます。これは、2つのリンクリストの各ノードの値を順番に比較し、値が小さい方のノードを取り出して、新しいリンクリストの末尾に追加するだけです。次に、2つのリンクリストの比較を続けて、一方のリンクリストの走査が完了すると、もう一方のリンクリストの残りすべてのノードを新しいリンクリストに直接追加できます。ロジックは次のとおりです。
元のリンクリスト:1-> 2-> 4-> null、1-> 3-> 4-> 5-> 6-> null
は、ノード値を順番に比較し、それぞれのヘッドノード
を取り出します。同じ値の1 = 1で、ノード1を取り出します。新しいリンクリストを作成する:1
現時点では、元のリンクリスト:2-> 4-> null、1-> 3-> 4-> 5-> 6-> null
ヘッドノードの値を比較します。2> 1
1つのノードを取り出し、新しいリンクリストの最後に追加します。1-> 1
この時点で、元のリンクリスト:2-> 4-> null、3-> 4-> 5-> 6-> null
ヘッドノードの値を比較します。2 <3
2つのノードを取り出し、それらを新しいリンクリストの最後に追加します。1-> 1-> 2
この時点で、元のリンクリスト:4-> null、3-> 4-> 5-> 6-> null
…など、元のリンクリストの1つが空になるまで:
元のリンクリスト:null、4-> 5-> 6-> null
新しいリンクリスト:1-> 1-> 2-> 3-> 4
現時点では、元のリンクリストの1つは既に空なので、別の元のリンクリストを直接追加します新しいリストの終わり:
1-> 1-> 2-> 3-> 4-> 4-> 5-> 6-> null
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = new ListNode(-1);//新建虚拟头节点
ListNode cur = head;//当前节点指向虚拟头节点
while (l1 != null && l2 != null) {
//循环条件为链表都不为空
if (l1.val < l2.val) {
//比较头节点的值的大小
cur.next = l1;//当前节点连接到节点值较小的一个
l1 = l1.next;//刷新原链表头节点
cur = cur.next;//刷新当前节点
} else {
cur.next = l2;
l2 = l2.next;
cur = cur.next;
}
}
if (l1 == null) cur.next = l2;//选择另外一个不为空的原链表,连接到新链表末尾
else cur.next = l1;
return head.next;//返回虚拟头节点的下一个节点,即真实头节点
}
}
/*作者:爱写Bug
链接:https://www.imooc.com/article/289851
来源:慕课网
本文首次发布于慕课网 ,转载请注明出处,谢谢合作