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