[21] 2つの順序付きリストバックル合力

まず、対象の説明:

2は、新たなソートされたリストとリターンにリストを命じました。新しいリストは、二つのリストで構成与えられたモザイク内のすべてのノードです。

例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/merge-two-sorted-lists
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。

第二に、問題解決のアイデア:

1、特殊なケース:L1 L2、空のリストを返すL2でL1空のリストを返す。
2、新しいリストを作成します。L1の値が小さい場合はL1とL2の値は、比較され、新しいリンクリストへのL1プットの値、そうでない場合、新しいリストにL2の値。
図3は、長さL1およびL2リストを考える必要があります。CUR1がnullの場合、whileループ後、CUR2がnullでない場合、結果リストは、リンクされた直接CUR2新しいノードがリストの最後に挿入されソートされ、新しいノードにリストCUR1のそうでなければ終了。

第三に、コード説明:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    // l1 为空, 最终结果就是 l2
        if(l1==null){
            return l2;
        }
        if(l2==null){
            return l1;
        }
         ListNode newHead=new ListNode(-1);
         ListNode newTail=newHead;
         ListNode cur1=l1;
         ListNode cur2=l2;
         while(cur1!=null&&cur2!=null){
            if(cur1.val<cur2.val){
                newTail.next=new ListNode(cur1.val);
                newTail=newTail.next;
                cur1=cur1.next;
            }
            else{
                newTail.next=new ListNode(cur2.val);
                newTail=newTail.next;
                cur2=cur2.next;
            }
         }
         //while循环结束后,cur1和cur2有一个到达链表末尾,
         //把没到末尾的链表剩下的元素插入到新链表尾节点中
         if(cur1==null){
            newTail.next=cur2;
         }
         if(cur2==null){
             newTail.next=cur1;
         }
         return newHead.next;
    }
}
公開された75元の記事 ウォン称賛14 ビュー1899

おすすめ

転載: blog.csdn.net/qq_45328505/article/details/104631639