• 面试题15:合并两个排序的链表


    方法一:非递归

    代码:

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    struct ListNode
    {
    	int m_nValue;
    	ListNode *m_pNext;
    };
    
    //合并两个有序链表,非递归方法
    ListNode *MergeTwoList(ListNode *pListOneHead, ListNode *pListTwoHead)
    {
    	if (pListOneHead == NULL)
    	{
    		return pListTwoHead;
    	}
    
    	if (pListTwoHead == NULL)
    	{
    		return pListOneHead;
    	}
    
    	ListNode *pNode1 = pListOneHead;
    	ListNode *pNode2 = pListTwoHead;
        ListNode *pMergeListHead = NULL;
    	ListNode *pCurLastNode = NULL;
    
    	if (pNode1->m_nValue < pNode2->m_nValue)
    	{			
    		pMergeListHead = pListOneHead;
    		pNode1 = pNode1->m_pNext;
    		pCurLastNode = pMergeListHead;
    	}
    	else
    	{
    		pMergeListHead = pListTwoHead;
    		pNode2 = pNode2->m_pNext;
    		pCurLastNode = pMergeListHead;
    	}
    
        while (pNode1 != NULL && pNode2 != NULL)
        {
    		if (pNode1->m_nValue < pNode2->m_nValue)
    		{	
    			pCurLastNode->m_pNext = pNode1;
    			pCurLastNode = pNode1;
    			pNode1 = pNode1->m_pNext;			
    		}
    		else
    		{
    			pCurLastNode->m_pNext = pNode2;
    			pCurLastNode = pNode2;
    			pNode2 = pNode2->m_pNext;			
    		}
    
    		if (pNode1 == NULL)
    		{
    			pCurLastNode->m_pNext = pNode2;				
    		}
    		
    		if (pNode2 == NULL)
    		{
    			pCurLastNode->m_pNext = pNode1;			
    		}
        }
    
    	return pMergeListHead;
    }
    
    //创建一个链表,输入从头到尾结点的值,输入-1表示结束
    void CreateList(ListNode *& pHead)
    {	
    	ListNode *pListNode = NULL;
    	ListNode *pCurLastNode = NULL;
    	bool isHead = true;
    
    	while (1)
    	{
    		if (isHead)
    		{	
    			pHead = new ListNode();
    			cin >> pHead->m_nValue;
    			if (pHead->m_nValue == -1)
    			{
    				pHead = NULL;
    				break;
    			}
    			pHead->m_pNext = NULL;
    			isHead = false;
    			pCurLastNode = pHead;
    		}
    		else
    		{
    			pListNode = new ListNode();
    			cin >> pListNode->m_nValue;
    			if (pListNode->m_nValue == -1)
    			{
    				break;
    			}
    			pListNode->m_pNext = NULL;
    			pCurLastNode->m_pNext = pListNode;
    			pCurLastNode = pListNode;	
    		}			
    	}
    }
    
    //从头到尾打印链表
    void PrintList(ListNode *&pHead)
    {
    	if (pHead != NULL)
    	{
    		ListNode *pCur = pHead;
    		while (pCur != NULL)
    		{
    			cout << pCur->m_nValue << " ";
    			pCur = pCur->m_pNext;
    		}
    		cout << endl;
    	}
    	else
    	{
    		cout << "链表为空!" << endl;
    	}
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	ListNode *pList1Head = NULL;
    	CreateList(pList1Head);
    	PrintList(pList1Head);
    
    	ListNode *pList2Head = NULL;
    	CreateList(pList2Head);
    	PrintList(pList2Head);
    
    	ListNode *pMergeListHead = MergeTwoList(pList1Head, pList2Head);
    	if (pMergeListHead != NULL)
    	{
    		cout << pMergeListHead->m_nValue << endl;
    	}	
    	PrintList(pMergeListHead);
    
    	system("pause");
    	return 0;
    }
    
    

    方法二:递归

    代码:

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    struct ListNode
    {
    	int m_nValue;
    	ListNode *m_pNext;
    };
    
    //合并两个有序链表,递归方法
    ListNode *MergeTwoList(ListNode *pListOneHead, ListNode *pListTwoHead)
    {
    	if (pListOneHead == NULL)
    	{
    		return pListTwoHead;
    	}
    
    	if (pListTwoHead == NULL)
    	{
    		return pListOneHead;
    	}
    
    	ListNode *pMergeListHead = NULL;
    
    	if (pListOneHead->m_nValue < pListTwoHead->m_nValue)
    	{
            pMergeListHead = pListOneHead;
    		pMergeListHead->m_pNext = MergeTwoList(pMergeListHead->m_pNext, pListTwoHead);
    	}
    	else
    	{
    		pMergeListHead = pListTwoHead;
    		pMergeListHead->m_pNext = MergeTwoList(pListOneHead, pMergeListHead->m_pNext);
    	}
    
    	return pMergeListHead;
    }
    
    //创建一个链表,输入从头到尾结点的值,输入-1表示结束
    void CreateList(ListNode *& pHead)
    {	
    	ListNode *pListNode = NULL;
    	ListNode *pCurLastNode = NULL;
    	bool isHead = true;
    
    	while (1)
    	{
    		if (isHead)
    		{	
    			pHead = new ListNode();
    			cin >> pHead->m_nValue;
    			if (pHead->m_nValue == -1)
    			{
    				pHead = NULL;
    				break;
    			}
    			pHead->m_pNext = NULL;
    			isHead = false;
    			pCurLastNode = pHead;
    		}
    		else
    		{
    			pListNode = new ListNode();
    			cin >> pListNode->m_nValue;
    			if (pListNode->m_nValue == -1)
    			{
    				break;
    			}
    			pListNode->m_pNext = NULL;
    			pCurLastNode->m_pNext = pListNode;
    			pCurLastNode = pListNode;	
    		}			
    	}
    }
    
    //从头到尾打印链表
    void PrintList(ListNode *&pHead)
    {
    	if (pHead != NULL)
    	{
    		ListNode *pCur = pHead;
    		while (pCur != NULL)
    		{
    			cout << pCur->m_nValue << " ";
    			pCur = pCur->m_pNext;
    		}
    		cout << endl;
    	}
    	else
    	{
    		cout << "链表为空!" << endl;
    	}
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	ListNode *pList1Head = NULL;
    	CreateList(pList1Head);
    	PrintList(pList1Head);
    
    	ListNode *pList2Head = NULL;
    	CreateList(pList2Head);
    	PrintList(pList2Head);
    
    	ListNode *pMergeListHead = MergeTwoList(pList1Head, pList2Head);
    	if (pMergeListHead != NULL)
    	{
    		cout << pMergeListHead->m_nValue << endl;
    	}	
    	PrintList(pMergeListHead);
    
    	system("pause");
    	return 0;
    }
    
    


  • 相关阅读:
    div定位左右居中
    highcharts绘制3D倾斜的饼图
    Echarts 图表不能渲染问题整理
    RK:系统手势监听
    RK:网络共存、Shell脚本
    泛型
    ArrayList类
    Linux(centos7)安装ClickHouse
    centos安装宝塔命令
    centos下修改hosts文件以及生效命令
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3206315.html
Copyright © 2020-2023  润新知