• 合并两个排序的链表



    • 题目描述:

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

    • 分析:

      因为要合并的两个序列是递增有序的,而合并后的序列也要求是单调不减的,所以两个链表的头结点中比较小的那一个就是新的链表的头。这样就确定了新链表的第一个结点,拿出这个结点作为合并链表的头结点后,剩下的问题还是要合并两个有序链表,只不过其中一个链表的大小比原来小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;
      }
      
  • 相关阅读:
    poj 3070 矩阵快速幂模板
    poj3207 2-SAT入门
    poj 3683 2-SAT入门
    2-SAT开坑
    poj 1442 名次树
    hdu 3068 最长回文子串 TLE
    poj 3261 二分答案+后缀数组 求至少出现k次的最长重复子序列
    poj 1743 二分答案+后缀数组 求不重叠的最长重复子串
    后缀数组笔记
    poj2774 后缀数组 求最长公共子串
  • 原文地址:https://www.cnblogs.com/Bill-LHR/p/6805749.html
Copyright © 2020-2023  润新知