合并两个排序的链表使之依然有序(不开辟新空间在原链表上操作的非递归版本)

Posted ssopp24

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并两个排序的链表使之依然有序(不开辟新空间在原链表上操作的非递归版本)相关的知识,希望对你有一定的参考价值。

    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    
        if ( NULL ==pHead1 )
            return pHead2;
        else if ( NULL == pHead2 )
            return pHead1;
        
        ListNode* pLessHead = NULL;
        ListNode* pGreaterHead = NULL;
        ListNode* pRet = NULL;					//注意保存"头"为了之后返回
        ListNode* pNext = NULL;
        
        if ( pHead1->val <= pHead2->val )
            pLessHead = pHead1;
            pGreaterHead = pHead2;
        
        else
            pLessHead = pHead2;
            pGreaterHead = pHead1;
        
        
        pRet = pLessHead;
        
		//仔细分析逻辑就会发现,不可能运行到 pLessHead为NULL
        while ( NULL != pGreaterHead )
            if ( pLessHead->val <= pGreaterHead->val )
                if ( NULL == pLessHead->next )
                    pLessHead->next = pGreaterHead;
                    return pRet;
                
                else if ( pLessHead->next->val >= pGreaterHead->val )
                    pNext = pGreaterHead->next;
                    
                    pGreaterHead->next = pLessHead->next;
                    pLessHead->next = pGreaterHead;
                    
                    pGreaterHead = pNext;
                    
                    pLessHead = pLessHead->next;
                
                else
                    pLessHead = pLessHead->next;
            
        //也不能运行到 else if ( pLessHead->val > pGreaterHead->val ) 这里。 因为第一次循环肯定会进入 第一个 pLessHead->val <= pGreaterHead->val 这个逻辑,一旦进入这个if语句,我们其中的逻辑条件可以保证它每次循环都只进入 第一个if语句。  所以结果是你要么  在循环中pLessHead为空,在循环中返回。 或者,pGreaterHead为空,在循环外返回,没有别的情况。
        
        return pRet;
    

以上是关于合并两个排序的链表使之依然有序(不开辟新空间在原链表上操作的非递归版本)的主要内容,如果未能解决你的问题,请参考以下文章

反转链表(在原链表进行操作,不开辟新空间. O(N)

两个排序链表的合并(Easy)

合并两个有序的单链表,合并之后的链表依然有序出现频率高

有序链表合并

合并有序链表

LeetCode21. Merge Two Sorted Lists合并两个有序链表,得到新的有序链表