1.9  如何合并两个有序链表

1.9 如何合并两个有序链表

【出自ALBB笔试题】

难度系数:★★★☆☆ 被考察系数:★★★★☆

题目描述:

已知两个链表head1和head2各自有序(例如升序排列),请把它们合并成一个链表,要求合并后的链表依然有序。

分析与解答:

分别用指针head1、head2来遍历两个链表,如果当前head1指向的数据小于head2指向的数据,则将head1指向的结点归入合并后的链表中,否则,将head2指向的结点归入合并后的链表中。如果有一个链表遍历结束,则把未结束的链表连接到合并后的链表尾部。

下图以一个简单的示例为例介绍合并的具体方法:

978-7-111-61212-4-Part02-35.jpg

由于链表按升序排列,首先通过比较链表第一个结点中元素的大小来确定最终合并后链表的头结点;接下来每次都找两个链表中剩余结点的最小值链接到被合并的链表后面,如上图中的虚线所示。在实现的时候需要注意,要释放head2链表的头结点,具体实现代码如下:

978-7-111-61212-4-Part02-36.jpg

978-7-111-61212-4-Part02-37.jpg

978-7-111-61212-4-Part02-38.jpg

程序的运行结果如下:

head1:1 3 5

head2:2 4 6

合并后的链表:1 2 3 4 5 6

算法性能分析:

以上这种方法只需要对链表进行一次遍历,因此,时间复杂度为O(n)。另外由于只需要几个指针变量来保存结点的地址信息,因此,空间复杂度为O(1)。