剑指offer-面试题17:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。

思路:每次从两个链表中选取较小的结点作为新链表的结点,那么这里有两种方法,循环或者递归。(1)循环,每次取出两个链表中较小的结点插入新链表,到达其中一个链表的尾结点时,另外一个链表的其余部分直接接在这个尾结点上。(2)从两个链表中选取较小的表头作为新链表的表头,那么剩下的问题就是两个新的已排序的链表的合并,只不过其中一个链表的表头已经后移了一个结点。这两个新链表的合并步骤和之前的是一样的,这就是典型的递归过程。

//合并两个已排序的链表,非递归
ListNode* MergeSortedList(ListNode* pListHead1, ListNode* pListHead2)
{
    if(pListHead1 == NULL)
        return pListHead2;
    else if(pListHead2 == NULL)
        return pListHead1;
    else
    {
	ListNode* pNode1 = pListHead1;
	ListNode* pNode2 = pListHead2;
	ListNode* pLastNode = NULL;
	ListNode* NewHead = NULL;
	if(pListHead1->m_nValue < pListHead2->m_nValue)
	{
	    NewHead = pListHead1;
	    pNode1 = pNode1->m_pNext;
	}
	else
	{
	    NewHead = pListHead2;
	    pNode2 = pNode2->m_pNext;
	}
	pLastNode = NewHead;
		
	if (pNode1 == NULL)   
            pLastNode->m_pNext = pNode2;                
          
        if (pNode2 == NULL)   
            pLastNode->m_pNext = pNode1;            
    	
	while (pNode1 != NULL && pNode2 != NULL)  
    	{  
            if (pNode1->m_nValue < pNode2->m_nValue)  
            {     
        	pLastNode->m_pNext = pNode1;  
            	pLastNode = pNode1;  
            	pNode1 = pNode1->m_pNext;              
            }  
            else  
            {  
            	pLastNode->m_pNext = pNode2;  
            	pLastNode = pNode2;  
            	pNode2 = pNode2->m_pNext;              
            }  
  
            if (pNode1 == NULL)  
            	pLastNode->m_pNext = pNode2;                  
            if (pNode2 == NULL)  
            	pLastNode->m_pNext = pNode1;             
    	}
	return NewHead;
    }
}
递归版本:

//合并两个已排序的链表,递归版本
ListNode* MergeSortedList(ListNode* pHead1, ListNode* pHead2)
{
    if(pHead1 == NULL)
        return pHead2;
    if(pHead2 == NULL)
        return pHead1;
    
    ListNode* pMergedHead = NULL;
    if(pHead1->m_nValue < pHead2->m_nValue)
    {
        pMergedHead = pHead1;
        pMergedHead->m_pNext = MergeSortedList(pHead1->m_pNext, pHead2);
    }
    else
    {
        pMergedHead = pHead2;
        pMergedHead->m_pNext = MergeSortedList(pHead2->m_pNext, pHead1);
    }

    return pMergedHead;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值