• 题目描述:

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

  • 分析:

    因为要合并的两个序列是递增有序的,而合并后的序列也要求是单调不减的,所以两个链表的头结点中比较小的那一个就是新的链表的头。这样就确定了新链表的第一个结点,拿出这个结点作为合并链表的头结点后,剩下的问题还是要合并两个有序链表,只不过其中一个链表的大小比原来小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;
    }
    
 posted on 2017-05-04 10:43  Bill_LHR  阅读(250)  评论(0编辑  收藏  举报