合并两个排序链表问题 不会的有这篇文章就够了!!!

问题分析 与 思路解析

问题分析

题目: 将两个 排序的链表合并,例如:

在这里插入图片描述

既然是合并两个排序链表,那么我们仅仅只需要 重新有一个链表 逐步从 L1 和 L2 挑选更小的节点进行连接即可
过程如图所示:

在这里插入图片描述

之后反复进行上图的过程,即可得到一个合并的链表

思路分析:

当我们找到两个链表中值比较小的值并链接已经合并的链表后,两个链表剩余的节点仍旧是排序的,也就是说我们之后可以重复进行合并 其余节点的两个链表,递归过程。

在这里插入图片描述

写出更加具有鲁棒性的代码

节点定义:

struct ListNode
{
    int        m_nValue;
    ListNode*  m_pNext;
};


解题函数声明;

ListNode* MergeSortList(ListNode* pHead1, ListNode* pHead2);

每当代码试图访问空指针时,就会导致鲁棒性的问题,我们来解决解决。

  1. 当输入的 pHead1 为空时,我们直接返回 pHead2;(不需要合并 pHead1 该单链表)
  2. 当输入的 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;
}


猜你喜欢

转载自blog.csdn.net/chongzi_daima/article/details/105866048