![Java程序员面试算法宝典](https://wfqqreader-1252317822.image.myqcloud.com/cover/248/26268248/b_26268248.jpg)
上QQ阅读APP看书,第一时间看更新
1.9 如何合并两个有序链表
【出自ALBB笔试题】
难度系数:★★★☆☆
被考察系数:★★★★☆
题目描述:
已知两个链表head1 和head2 各自有序(如升序排列),请把它们合并成一个链表,要求合并后的链表依然有序。
分析与解答:
分别用指针head1、head2来遍历两个链表,如果当前head1指向的数据小于head2指向的数据,则将head1 指向的结点归入合并后的链表中,否则将head2 指向的结点归入合并后的链表中。如果有一个链表遍历结束,则把未结束的链表连接到合并后的链表尾部。
下图以一个简单的示例为例介绍合并的具体方法。
![](https://epubservercos.yuewen.com/71257F/14700476205665206/epubprivate/OEBPS/Images/55_01.jpg?sign=1739255046-z7F4TWF6FqFSg0PivFw4xY8ZdqJdYPML-0-65bd72c13582cff218090a37590e2d25)
由于链表按升序排列,首先通过比较链表第一个结点中元素的大小来确定最终合并后链表的头结点;接下来每次都找两个链表中剩余结点的最小值链接到被合并的链表后面,如上图中的虚线所示。在实现的时候需要注意,要释放head2链表的头结点,实现代码如下:
![](https://epubservercos.yuewen.com/71257F/14700476205665206/epubprivate/OEBPS/Images/55_02.jpg?sign=1739255046-CJDiCskKi9afqwyl1DXUlfAOk5cdFwDj-0-a90aad57866eaa50299c33ebf72761e4)
![](https://epubservercos.yuewen.com/71257F/14700476205665206/epubprivate/OEBPS/Images/56_01.jpg?sign=1739255046-96okoB4gk2N8tDosAhZF0SrVJs6n7Kpz-0-15f90f1ef7535eba6e8ee198aa7cbb1c)
![](https://epubservercos.yuewen.com/71257F/14700476205665206/epubprivate/OEBPS/Images/57_01.jpg?sign=1739255046-m1UJMfGV1ZLCbUKDdcBVV7XhtFBVNB67-0-f815c9413c98a310a8b2bbaa103465c4)
程序的运行结果为
![](https://epubservercos.yuewen.com/71257F/14700476205665206/epubprivate/OEBPS/Images/57_02.jpg?sign=1739255046-d4iT1eNUdpUDESPCkOmNtJfaXZ13vE8J-0-b8ef7fb8c3a629dbfe7abe5ffb21a58f)
算法性能分析:
以上这种方法只需要对链表进行一次遍历,因此,时间复杂度为O(n)。另外,由于只需要几个指针变量来保存结点的地址信息,因此,空间复杂度为O(1)。