zoukankan      html  css  js  c++  java
  • 【剑指Offer-代码的鲁棒性】面试题25:合并两个排序的链表

    题目描述

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

    思路1

    可以使用循环来做。首先要确定合并后链表的头。如果第一个链表为空,则合并后的链表就是第二个链表;同样地,如果第二个链表为空,则合并后的链表就是第一个链表;如果两个链表均不为空,则合并后的链表头为两个链表头结点中值较小的那个。确定表头后,可以对两个链表进行遍历:设cur1为第一个链表的当前结点,cur2为第二个链表的当前结点,如果cur1->val>cur2<val,则将cur2加入到链表中; 否则将cur1加入到链表中。直至两个链表都遍历结束。代码如下:

    /*
    struct ListNode {
    	int val;
    	struct ListNode *next;
    	ListNode(int x) :
    			val(x), next(NULL) {
    	}
    };*/
    class Solution {
    public:
        ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
        {
            if(pHead1==nullptr && pHead2==nullptr)
                return nullptr;
            
            ListNode* pHead3;    //合并后的链表头
            ListNode* cur1 = pHead1;
            ListNode* cur2 = pHead2;
            if(cur1!=nullptr&&cur2!=nullptr)    //确定pHead3
            {
                if(cur1->val>cur2->val)
                {
                    pHead3 = cur2;
                    cur2 = cur2->next;
                }
                else if(cur1->val<cur2->val)
                {
                    pHead3 = cur1;
                    cur1 = cur1->next;
                }
                else
                {
                    pHead3 = cur1;
                    cur1 = cur1->next;
                }
            }
            else if(cur1==nullptr&&cur2!=nullptr)
            {
                pHead3 = cur2;
                cur2 = cur2->next;
            }
            else if(cur1!=nullptr&&cur2==nullptr)
            {
                pHead3 = cur1;
                cur1 = cur1->next;
            }
            ListNode* cur = pHead3;
            
            while(cur1!=nullptr||cur2!=nullptr)    //合并两个链表
            {
                if(cur1!=nullptr&&cur2!=nullptr)
                {
                    if(cur1->val>cur2->val)
                    {
                        cur->next = cur2;
                        cur = cur->next;
                        cur2 = cur2->next;
                    }
                    else if(cur1->val<cur2->val)
                    {
                        cur->next = cur1;
                        cur = cur->next;
                        cur1 = cur1->next;
                    }
                    else
                    {
                        cur->next = cur1;
                        cur = cur->next;
                        cur1 = cur1->next;
                    }
                 }
                 else if(cur1==nullptr&&cur2!=nullptr)
                 {
                     while(cur2!=nullptr)
                     {
                         cur->next = cur2;
                         cur = cur->next;
                         cur2 = cur2->next;
                     }
                 }
                 else if(cur1!=nullptr&&cur2==nullptr)
                 {
                     while(cur1!=nullptr)
                     {
                         cur->next = cur1;
                         cur = cur->next;
                         cur1 = cur1->next;
                     }
                 }
            }
            return pHead3;
        }
    };
    

    思路2

    由于每次合并的步骤是一样的,所以可以使用递归来做。代码如下:

    /*
    struct ListNode {
    	int val;
    	struct ListNode *next;
    	ListNode(int x) :
    			val(x), next(NULL) {
    	}
    };*/
    class Solution {
    public:
        ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
        {
            if(pHead1==nullptr && pHead2==nullptr)
                return nullptr;
            
            if(pHead1==nullptr)
                return pHead2;
            if(pHead2==nullptr)
                return pHead1;
            
            if(pHead1->val>pHead2->val)
            {
                pHead2->next = Merge(pHead1, pHead2->next);
                return pHead2;
            }
            else
            {
                pHead1->next = Merge(pHead1->next, pHead2);
                return pHead1;
            }
        }
    };
    
  • 相关阅读:
    ImageWatch 无法安装在VS2017环境下的解决方案
    Android CmakeList
    Android 工程越来越大,运行变卡解决方法
    奥卡姆剃刀(简约之法则)
    Cmake时 如何在windows命令行 选择vs版本
    ubuntu 18.04 安装tensorflow 2 cuda10 CUDNN Anaconda3
    Centos7简易通过yum安装phpmyadmin
    centos7 nigx 免费永久获取 Let‘s Encrypt 证书
    Execution failed for task ':app:compileDebugJavaWithJavac'
    centos 安装aconda
  • 原文地址:https://www.cnblogs.com/flix/p/12451695.html
Copyright © 2011-2022 走看看