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


    • 题目描述:

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

    • 分析:

      因为要合并的两个序列是递增有序的,而合并后的序列也要求是单调不减的,所以两个链表的头结点中比较小的那一个就是新的链表的头。这样就确定了新链表的第一个结点,拿出这个结点作为合并链表的头结点后,剩下的问题还是要合并两个有序链表,只不过其中一个链表的大小比原来小1。这就达到了递归的条件:可以将原问题分解成规模较小的与原问题相同的问题。所以,这道题可以用递归解决。
      需要注意的是鲁棒性,以及如果使用递归需要有结束递归的条件。那么每次缩小问题的规模,即选择两个链表较小的一个头结点作为新序列的结点,然后转为求剩下两个较小链表的合并,极限情况就是有一个链表为空。所以,要考虑输入为空指针的情况:若list1为空则返回list2,list2为空返回list1。

      递归:

      class Solution {
      public:
      	ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
      	{
      		if(pHead1 == NULL) 
      			return pHead2;
      		else if(pHead2 == NULL)
      			return pHead1;
      		
      		ListNode *pHead3 = NULL;
      		
      		if(pHead1->val < pHead2->val){
      			pHead3 = pHead1;
      			pHead3->next = Merge(pHead1->next,pHead2);
      		}
      		else{
      			pHead3 = pHead2;
      			pHead3->next = Merge(pHead1,pHead2->next);
      		}
      		
      		return pHead3;
      	}
      };
      

      非递归:

      ListNode* Merge(ListNode *pHead1, ListNode *pHead2)
      {
      	if (pHead1 == NULL)
      		return pHead2;
      	else if (pHead2 == NULL)
      		return pHead1;
      
      	ListNode *pHead3 = NULL;
      	if (pHead1->m_nValue < pHead2->m_nValue)
      	{
      		pHead3 = pHead1;
      		pHead1 = pHead1->m_pNext;
      	}
      	else
      	{
      		pHead3 = pHead2;
      		pHead2 = pHead2->m_pNext;
      	}
      
      	ListNode *p3 = pHead3;
      
      	while (pHead1 != NULL && pHead2 != NULL)
      	{
      		if (pHead1->m_nValue < pHead2->m_nValue)
      		{
      			p3->m_pNext = pHead1;
      			pHead1 = pHead1->m_pNext;
      			p3 = p3->m_pNext;
      		}
      		else
      		{
      			p3->m_pNext = pHead2;
      			pHead2 = pHead2->m_pNext;
      			p3 = p3->m_pNext;
      		}
      	}
      
      	if (pHead1 != NULL)
      		p3->m_pNext = pHead1;
      	else if (pHead2 != NULL)
      		p3->m_pNext = pHead2;
      
      	return pHead3;
      }
      
  • 相关阅读:
    [USACO15FEB]Superbull 超级牛
    [SHOI2015]自动刷题机
    [BJOI2019]排兵布阵
    P3528 [POI2011]PAT-Sticks
    P3539 [POI2012]ROZ-Fibonacci Representation
    洛谷P1868 饥饿的奶牛
    洛谷P1462 通往奥格瑞玛的道路(SPFA+二分答案)
    [SDOI2008]山贼集团
    [SHOI2013]阶乘字符串
    30. 如何使用 GDB 调试 Go 程序?
  • 原文地址:https://www.cnblogs.com/Bill-LHR/p/6805749.html
Copyright © 2011-2022 走看看