(十七)合并两个有序的单链表

本文介绍了如何以O(M+N)的时间复杂度和O(1)的额外空间复杂度合并两个有序的单链表。通过比较链表头节点的值,逐步合并两个链表,确保合并后的链表依然有序。详细解题步骤包括特殊情况处理、链表遍历和节点调整,以及C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目】给定两个有序单链表的头节点head1和head2,请合并两个有序链表,合并后的链表也必须有序,并返回合并后链表的头节点

【要求】 假设两个链表的长度分别为M,N,要求时间复杂度为O(M+N),额外空间复杂度O(1);

【解题步骤】

  • (1)若两个链表有一个为空,则无需合并,返回另一个链表的头节点
  • (2)比较head1和head2的值,小的节点也是合并后链表的最小节点,它是合并后链表的头节点,记为head
  • (3)假设head所在的链表为head1,,另一个链表为head2,两个链表都从头开始遍历,比较每次遍历的两个节点的值记为cur1,cur2,然后根据大小关系进行调整。并用变量pre表示上次比较时比较小的节点;
  • (4)若链表1先走完,那就把链表2剩下的部分拼接到pre的后面,即pre->next 指向 cur2;若链表2先走完,说明链表2的所有节点都已经插入到链表1中,调整结束

【举例】

链表1:1->5->6->NULL
链表2:2->3->7->NULL
在这里插入图片描述

  • 令cur1 = 1;cur2 = 2;pre = NULL;cur1小于cur2,cur1不做调整,令pre = cur1 = 1;继续遍历cur1的下一个节点即cur1 = 5;
  • cur1 = 5;cur2 = 2;pre1 = 1;cur2小于cur1,让pre->next 指向 cur2,cur2的指针指向cur1,这样cur2便插入到cur1中。pre = cur2 = 2;继续遍历下一节点cur2 = 3;此时链表1变为1->2->3->5->6->NULL;链表2变为3->7->NULL;cur1 = 5,cur2 = 3,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值