题目描述(难度:中等)
已知两个链表 head1 和 head2 各自有序(例如升序排列),请把它们合并成一个链表,要求合并后的链表依然有序。(来源:阿里)
单链表结构

class LNode:
def __init__(self):
self.data = None # 数据域
self.next = None # 指针域
- 由于单链表中每个结点的地址都存储在其前驱结点的指针域中,因此,对单链表中任何一个结点的访问只能从链表的头指针开始进行遍历。
- 注意:在修改结点指针域的时候,记录下后继结点的地址,否则会丢失后继结点。
方法一

# 构造链表
def ConstructList(start):
i = start
head = LNode()
head.next = None
cur = head
while i < 7:
tmp = LNode()
tmp.data = i
tmp.next = None
cur.next = tmp
cur = tmp
i += 2
return head
def PrintList(head):
cur = head.next
while cur != None:
print(cur.data, '', end='')
cur = cur.next
# 合并两个升序排列的单链表
def Merge(head1, head2):
if head1 == None or head1.next == None:
return head2
if head2 == None or head2.next == None:
return head1
cur1 = head1.next # 用来遍历head1
cur2 = head2.next # 用来遍历head2
head = None # 合并后链表的头结点
cur = None # 合并后的链表在尾结点
# 合并后链表的头结点为第一个结点元素最小的那个链表的头结点
if cur1.data > cur2.data:
head = head2
cur = cur2
cur2 = cur2.next
else:
head = head1
cur = cur1
cur1 = cur1.next
# 每次找链表剩余结点的最小值对应的结点连接到合并后链表的尾部
while cur1 != None and cur2 != None:
if cur1.data < cur2.data:
cur.next = cur1
cur = cur1
cur1 = cur1.next
else:
cur.next = cur2
cur = cur2
cur2 = cur2.next
# 当遍历完一个链表后把另外一个链表剩余的结点链接到合并后的链表后面
if cur1 != None:
cur.next = cur1
if cur2 != None:
cur.next = cur2
return head
复杂度分析
- 时间复杂度为 O ( n ) O(n) O(n),只对链表进行一次遍历。
- 空间复杂度为 O ( 1 ) O(1) O(1),只需常量个指针变量来保存结点的地址信息。
主函数
if __name__=="__main__":
head1=ConstructList(1)
head2=ConstructList(2)
print ("head1: ",end='')
PrintList(head1)
print ("\nhead2: ",end='')
PrintList(head2)
print ("\n合并后的链表:",end='')
head=Merge(head1,head2)
PrintList(head)
参考文献
[1] 何海涛. 剑指Offer:名企面试官精讲典型编程题(第2版). 北京: 电子工业出版社,2017
[2] 张波,楚秦. Python程序员面试算法宝典. 北京:机械工业出版社,2018
本文介绍了一种合并两个升序排列的单链表的方法,确保合并后的链表仍保持有序状态。通过构造单链表并使用指针遍历,比较两链表节点值,将较小值节点链接至新链表尾部,最终实现高效合并。
552

被折叠的 条评论
为什么被折叠?



