合并两个排序链表
问题分析 与 思路解析
问题分析
题目: 将两个 排序的链表合并,例如:
既然是合并两个排序链表,那么我们仅仅只需要 重新有一个链表 逐步从 L1 和 L2 挑选更小的节点进行连接即可
过程如图所示:
之后反复进行上图的过程,即可得到一个合并的链表
思路分析:
当我们找到两个链表中值比较小的值并链接已经合并的链表后,两个链表剩余的节点仍旧是排序的,也就是说我们之后可以重复进行合并 其余节点的两个链表,递归过程。
写出更加具有鲁棒性的代码
节点定义:
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
解题函数声明;
ListNode* MergeSortList(ListNode* pHead1, ListNode* pHead2);
每当代码试图访问空指针时,就会导致鲁棒性的问题,我们来解决解决。
- 当输入的 pHead1 为空时,我们直接返回 pHead2;(不需要合并 pHead1 该单链表)
- 当输入的 pHead2 为空时,我们直接返回 pHead1;(不需要合并 pHead2 该单链表)
代码:
我们利用递归重复执行合并链表的过程,完成最终的合并两个链表的过程。
//Merge sort list
ListNode* MergeSortList(ListNode* pHead1, ListNode* pHead2) {
if (pHead1 == nullptr)
return pHead2;
if (pHead2 == nullptr)
return pHead1;
ListNode* pMergeHead = nullptr;
if (pHead1->m_nValue <= pHead2->m_nValue) {
pMergeHead = pHead1;
pMergeHead->m_pNext = MergeSortList(pHead1->m_pNext, pHead2);
}
else {
pMergeHead = pHead2;
pMergeHead->m_pNext = MergeSortList(pHead1, pHead2->m_pNext);
}
return pMergeHead;
}