LeeCode(再帰、反復)21_2つの順序付けられたリンクリストをマージする
トピック:
2つの昇順リンクリストを新しい昇順リンクリストに結合して戻ります。新しいリンクリストは、指定された2つのリンクリストのすべてのノードを接続することによって構成されます。
例:
入力:1-> 2-> 4、1-> 3-> 4
出力:1-> 1-> 2-> 3-> 4-> 4
出典:LeetCode
リンク:https ://leetcode-cn.com/problems/merge-two-sorted-lists
著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
問題解決のアイデア:
最初にl1とl2のどちらのヘッドノードが小さいかを判別し、それを合成リンクリストの最初のノードとして使用してから、小さい値を持つ次のノードを再帰的に判別します。
方法1:
再帰
Javaコード:
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val; }
ListNode(int val, ListNode next) {
this.val = val; this.next = next; }
}
public class 合并两个有序链表 {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null){
return l2;
}else if(l2==null){
return l1;
}else if(l1.val<l2.val){
l1.next = mergeTwoLists(l1.next, l2);
return l1;
}else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode prehead = new ListNode();
//保存链表头
ListNode prev = prehead;
while(l1!=null && l2!=null){
if(l1.val<l2.val){
prehead.next = l1;
l1 = l1.next;
}else {
prev.next = l2;
l2 = l2.next;
}
}
// 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
prev.next = l1 == null ? l2 : l1;
return prev.next;
}
}
方法2:
反復
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val; }
ListNode(int val, ListNode next) {
this.val = val; this.next = next; }
}
public class 合并两个有序链表 {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode prehead = new ListNode();
//保存链表头
ListNode prev = prehead;
while(l1!=null && l2!=null){
if(l1.val<l2.val){
prehead.next = l1;
l1 = l1.next;
}else {
prev.next = l2;
l2 = l2.next;
}
}
// 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
prev.next = l1 == null ? l2 : l1;
return prev.next;
}
}