合并两个排序的链表 迭代+递归(rust+cpp)
BM4 合并两个排序的链表
描述
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0≤𝑛≤10000≤n≤1000,−1000≤节点值≤1000−1000≤节点值≤1000要求:空间复杂度 𝑂(1)O(1),时间复杂度 𝑂(𝑛)O(n)
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:
或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:
思路
- 递归方法: 如果其中一个链表为空,直接返回另一个链表。比较两个链表当前节点的值,将较小节点作为合并后链表的头节点。递归地将剩余部分的链表进行合并,将结果连接到当前节点的后面。返回合并后的链表。
- 迭代方法: 创建一个新的虚拟头结点(dummy node)作为合并后链表的头部。使用一个指针指向新链表的当前节点,初始时指向虚拟头结点。遍历两个输入链表,比较当前节点的值,将较小的节点接在当前节点后面,并移动到下一个节点。如果其中一个链表已经遍历完,将另一个链表的剩余部分直接接在新链表的末尾。返回虚拟头结点的下一个节点作为合并后的链表。
不管是用哪一种方法实现,核心的思路都是取得两个链表中较小值得结点插入到新链表中,最后得出得新链表就是有序得;
图解
- 初始状态:

- 比较两个链表第一个结点值

- p1->next和p2比较

- p1->next和p2->next比较

- 以此类推,最终的比较结果

代码实现
- C++
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
// 递归,每次合在头节点添加一个较小的结点
if (pHead1 == nullptr) return pHead2;
if (pHead2 == nullptr) return pHead1;
// 创建一个新的链表,用来表示合并后的新链表;
ListNode* mHead = nullptr;
if (pHead1->val < pHead2->val)
{
mHead = pHead1;
mHead ->next = Merge(pHead1 -> next,pHead2);
} else
{
mHead = pHead2;
mHead->next = Merge(pHead1,pHead2 ->next);
}
return mHead;
}
// 迭代实现
ListNode* Merg
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
小白专属-牛客题解 文章被收录于专栏
专注于牛客平台编程题题解,文字+图解。内容很细,小白友好系列



上海得物信息集团有限公司公司福利 1237人发布