zoukankan      html  css  js  c++  java
  • 第25题:合并两个排序的链表

    题目描述

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

    测试用例

    // list1: 1->3->5
    // list2: 2->4->6
    void Test1()
    {
        ListNode* pNode1 = CreateListNode(1);
        ListNode* pNode3 = CreateListNode(3);
        ListNode* pNode5 = CreateListNode(5);
    
        ConnectListNodes(pNode1, pNode3);
        ConnectListNodes(pNode3, pNode5);
    
        ListNode* pNode2 = CreateListNode(2);
        ListNode* pNode4 = CreateListNode(4);
        ListNode* pNode6 = CreateListNode(6);
    
        ConnectListNodes(pNode2, pNode4);
        ConnectListNodes(pNode4, pNode6);
    
        ListNode* pMergedHead = Test("Test1", pNode1, pNode2);
    
        DestroyList(pMergedHead);
    }
    
    // 两个链表中有重复的数字
    // list1: 1->3->5
    // list2: 1->3->5
    void Test2()
    {
        ListNode* pNode1 = CreateListNode(1);
        ListNode* pNode3 = CreateListNode(3);
        ListNode* pNode5 = CreateListNode(5);
    
        ConnectListNodes(pNode1, pNode3);
        ConnectListNodes(pNode3, pNode5);
    
        ListNode* pNode2 = CreateListNode(1);
        ListNode* pNode4 = CreateListNode(3);
        ListNode* pNode6 = CreateListNode(5);
    
        ConnectListNodes(pNode2, pNode4);
        ConnectListNodes(pNode4, pNode6);
    
        ListNode* pMergedHead = Test("Test2", pNode1, pNode2);
    
        DestroyList(pMergedHead);
    }
    
    // 两个链表都只有一个数字
    // list1: 1
    // list2: 2
    void Test3()
    {
        ListNode* pNode1 = CreateListNode(1);
        ListNode* pNode2 = CreateListNode(2);
    
        ListNode* pMergedHead = Test("Test3", pNode1, pNode2);
    
        DestroyList(pMergedHead);
    }
    
    // 一个链表为空链表
    // list1: 1->3->5
    // list2: 空链表
    void Test4()
    {
        ListNode* pNode1 = CreateListNode(1);
        ListNode* pNode3 = CreateListNode(3);
        ListNode* pNode5 = CreateListNode(5);
    
        ConnectListNodes(pNode1, pNode3);
        ConnectListNodes(pNode3, pNode5);
    
        ListNode* pMergedHead = Test("Test4", pNode1, nullptr);
    
        DestroyList(pMergedHead);
    }
    
    // 两个链表都为空链表
    // list1: 空链表
    // list2: 空链表
    void Test5()
    {
        ListNode* pMergedHead = Test("Test5", nullptr, nullptr);
    }

     

     考点

    1.鲁棒性

    2.递归:从后往前

    3.链表 指针

     思路

    1.递归结束:如果有一个链表是空,返回另一个链表

    2.递归操作:将剩下两个链表最小的头节点作为合并后的头节点;并将 合并后的头节点的下个节点 设置为 剩下链表合并后的头节点。

    4.递归返回:合并后的头节点

     第一遍

    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
    	//1.如果有一个是空链表,返回另外一个
    	if (!pHead1)
    		return pHead2;
    	else if (!pHead2)
    		return pHead1;
    
    	//2.定义新链表的头指针
    	ListNode* MergeNode = nullptr;
    
    	//3.比较两个链表的头节点大小,进行递归
    	if (pHead1->m_nValue <  pHead2->m_nValue)
    	{
    		//3.1如果链表1的节点小,拿出来,MergeNode->m_pNext进行递归
    		MergeNode = pHead1;
    		MergeNode->m_pNext = Merge(pHead1->m_pNext, pHead2);
    
    	}
    	else
    	{
    		//3.2如果链表2的节点小,拿出来
    		MergeNode = pHead2;
    		MergeNode->m_pNext = Merge(pHead1, pHead2->m_pNext);
    
    	}
    
    	//4.返回合并后的链表头指针
    	return MergeNode;
    }

    第二遍

    /*
    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)
                return pHead2;
            else if(!pHead2)
                return pHead1;
            
            ListNode* MergeNode=nullptr;
            
            if(pHead1->val<pHead2->val)
            {
                //剩下的两个链表合并后的头节点
                MergeNode=pHead1;
                //将头节点的下一个节点 设置为 剩下两个链表合并的头节点,递归
                MergeNode->next=Merge(pHead1->next,pHead2);
            }
            else 
            {
                MergeNode=pHead2;
                MergeNode->next=Merge(pHead1,pHead2->next);
            }
            
            return MergeNode;
        }
    };
  • 相关阅读:
    docker容器安装使用
    hashMap学习
    spark运行方式及其常用参数
    java面试题基础
    大数据面试题
    java面试题
    Java四种线程池
    大数据
    pyspark 日期格式
    CMake error:System Error:No such file or directory CMake error:Could not open file for write in copy operation xxxx.ros_Config.cmake.tmp.
  • 原文地址:https://www.cnblogs.com/lightmare/p/10398755.html
Copyright © 2011-2022 走看看