【数据结构】合并两个有序链表

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

  • 分析题目:根据题目可模拟画出如下示意图,须将链表1和链表2合并并排序为链表3

  • 解题思路:

    • 1、先找出链表1和链表二中较小的头结点,作为链表3的头结点

    • 2、使链表3的头结点指向剩余链表中较小的头结点

    • 3、重复找到剩余链表中较小结点,连向链表3

    • 4、这一过程可以使用递归来做

      • 每次传参传合并链表的尾结点和剩余链表中较小的结点

      • 递归的截至条件是其中一条链表剩余结点为空

  • 图解:

  • 代码实现
//定义结点的结构体
struct MergeList
{
       int value;
       struct MergeList* pNext;
};

MergeList* Merge(MergeList* pHead1, MergeList* pHead2)
{
       //当链表1或链表2的头结点为空时
       if (pHead1 == NULL)
              return pHead2;
       if (pHead2 == NULL)
              return pHead1;

       //分情况使用两种不同参数的递归
       MergeList* pMerged = NULL;
      
        //剩余链表1的头结点比剩余链表2的头结点小
       if (pHead1->value < pHead2->value)
       {
              pMerged = pHead1;
              pMerged->pNext = Merge(pHead1->pNext, pHead2);
       }
       
        //剩余链表1头结点比剩余链表2的头结点大
       else
       {
              pMerged = pHead2;
              pMerged->pNext = Merge(pHead1,pHead2->pNext);
       }
       return pMerged;
}
  • 注意事项:

    • 当两个链表均为空或任一为空时如何处理

    • 两个链表中存在相等结点的情况程序是否正确

    • 递归的截至条件是其中一条链表剩余结点为空

猜你喜欢

转载自blog.csdn.net/lxf_style/article/details/81304925