• LeetCode 第 21 号问题:合并两个有序链表


    本文首发于公众号「五分钟学算法」,是 图解 LeetCode 系列文章之一。
    个人网站: https://www.cxyxiaowu.com

    题目来源于 LeetCode 上第 21 号问题:合并两个有序链表。题目难度为 Easy,目前通过率为 45.8% 。

    题目描述

    将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

    示例:

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

    题目解析

    一般方案

    1.1 解题思想

    (1)对空链表存在的情况进行处理,假如 pHead1 为空则返回 pHead2 ,pHead2 为空则返回 pHead1。(两个都为空此情况在pHead1为空已经被拦截) (2)在两个链表无空链表的情况下确定第一个结点,比较链表1和链表2的第一个结点的值,将值小的结点保存下来为合并后的第一个结点。并且把第一个结点为最小的链表向后移动一个元素。 (3)继续在剩下的元素中选择小的值,连接到第一个结点后面,并不断next将值小的结点连接到第一个结点后面,直到某一个链表为空。 (4)当两个链表长度不一致时,也就是比较完成后其中一个链表为空,此时需要把另外一个链表剩下的元素都连接到第一个结点的后面。

    1.2 代码实现

            ListNode* mergeTwoOrderedLists(ListNode* pHead1, ListNode* pHead2){
        ListNode* pTail = NULL;//指向新链表的最后一个结点 pTail->next去连接
        ListNode* newHead = NULL;//指向合并后链表第一个结点
        if (NULL == pHead1){
            return pHead2;
        }else if(NULL == pHead2){
            return pHead1;
        }else{
            //确定头指针
            if ( pHead1->data < pHead2->data){
                newHead = pHead1;
                pHead1 = pHead1->next;//指向链表的第二个结点
            }else{
                newHead = pHead2;
                pHead2 = pHead2->next;
            }
            pTail = newHead;//指向第一个结点
            while ( pHead1 && pHead2) {
                if ( pHead1->data <= pHead2->data ){
                    pTail->next = pHead1;  
                    pHead1 = pHead1->next;
                }else {
                    pTail->next = pHead2;
                    pHead2 = pHead2->next;
                }
                pTail = pTail->next;
    
            }
            if(NULL == pHead1){
                pTail->next = pHead2;
            }else if(NULL == pHead2){
                pTail->next = pHead1;
            }
            return newHead;
    }
    
          

    2 递归方案

    2.1 解题思想

    (1)对空链表存在的情况进行处理,假如 pHead1 为空则返回 pHead2 ,pHead2 为空则返回 pHead1。 (2)比较两个链表第一个结点的大小,确定头结点的位置 (3)头结点确定后,继续在剩下的结点中选出下一个结点去链接到第二步选出的结点后面,然后在继续重复(2 )(3) 步,直到有链表为空。

    2.2 代码实现

            ListNode* mergeTwoOrderedLists(ListNode* pHead1, ListNode* pHead2){
        ListNode* newHead = NULL;
        if (NULL == pHead1){
            return pHead2;
        }else if(NULL ==pHead2){
            return pHead2;
        }else{
            if (pHead1->data < pHead2->data){
                newHead = pHead1;
                newHead->next = mergeTwoOrderedLists(pHead1->next, pHead2);
            }else{
                newHead = pHead2;
                newHead->next = mergeTwoOrderedLists(pHead1, pHead2->next);
             }
            return newHead;
        }   
    }
    
          

    我的专栏:

    和程序员小吴一起学算法

    ❤️ 看完三件事:

    如果你觉得这篇内容对你挺有启发,我想邀请你帮我三个忙:

    1. 点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-
    2. 关注我和专栏,让我们成为长期关系
    3. 关注公众号「五分钟学算法」,第一时间阅读最新的算法文章,公众号后台回复 1024 送你 50 本 算法编程书籍。

    v2-7d84a7f4361bd5f8d21b98b9edb0b1b4_b.jpg

  • 相关阅读:
    OpenStack--Rabbitmq组件消息队列
    Redis-主从
    haproxy mycat mysql 读写分离MHA高可用
    mysql小白系列_14 线上故障分析与排错
    mysql小白系列_13 Online DDL
    mysql小白系列_12 sysbench
    mysql小白系列_11 MHA补充
    mysql小白系列_11 MHA
    mysql小白系列_10 mysql主从复制原理
    mysql小白系列_09 mysql性能优化关键点
  • 原文地址:https://www.cnblogs.com/csnd/p/16675399.html
Copyright © 2020-2023  润新知