合并两个有序单链表 - Python 代码实现
合并两个有序单链表 - Python 代码实现
本文将介绍如何使用 Python 代码将两个非递减有序的单链表合并成一个新的非递减有序的单链表。
问题描述:
给定两个单链表 LA 和 LB,其元素均为非递减有序排列。编写算法将它们合并成一个单链表 LC,要求 LC 也是非递减有序排列,要求 LC 利用原表的存储空间。
算法实现:
可以使用双指针法来合并两个有序链表,同时利用原表的存储空间。以下是合并的算法实现:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def merge_sorted_lists(la: ListNode, lb: ListNode) -> ListNode:
# 创建一个哑结点作为合并后链表的头结点
dummy = ListNode(0)
lc = dummy
while la and lb:
if la.val <= lb.val:
# la 的值小于等于 lb 的值,将 la 的结点接到 lc 链表上
lc.next = la
la = la.next
else:
# lb 的值小于 la 的值,将 lb 的结点接到 lc 链表上
lc.next = lb
lb = lb.next
lc = lc.next
# 将剩余的结点接到 lc 链表上
if la:
lc.next = la
if lb:
lc.next = lb
# 返回合并后的链表,去除哑结点
return dummy.next
代码解释:
- 创建一个哑结点
dummy,作为合并后的链表的头结点。 - 使用两个指针
la和lb分别指向 LA 和 LB 的头结点。 - 使用指针
lc指向dummy,用于连接合并后的结点。 - 循环遍历 LA 和 LB 链表,比较
la.val和lb.val的大小。 - 如果
la.val小于等于lb.val,则将la指向的结点连接到lc链表上,并将la指针向后移动一位。 - 如果
lb.val小于la.val,则将lb指向的结点连接到lc链表上,并将lb指针向后移动一位。 - 在每次连接后,将
lc指针向后移动一位。 - 遍历完 LA 和 LB 链表后,将剩余的结点连接到
lc链表上。 - 返回合并后的链表,去除哑结点
dummy。
示例代码:
# 创建链表 LA
la = ListNode(1)
la.next = ListNode(3)
la.next.next = ListNode(5)
# 创建链表 LB
lb = ListNode(2)
lb.next = ListNode(4)
lb.next.next = ListNode(6)
# 合并链表 LA 和 LB
lc = merge_sorted_lists(la, lb)
# 打印合并后的链表 LC
while lc:
print(lc.val, end=' ')
lc = lc.next
输出结果:
1 2 3 4 5 6
总结:
使用双指针法和哑结点可以有效地合并两个有序单链表,同时利用原表的存储空间。该算法的时间复杂度为 O(m+n),其中 m 和 n 分别为两个链表的长度。
原文地址: https://www.cveoy.top/t/topic/cZzN 著作权归作者所有。请勿转载和采集!