关于链表的合并,常见的类型有两种:
- 直接合并,没有什么规则:将多个链表头尾相连合并成一个链表
- 有序链表合并成有序链表:两个有序链表合并成一个有序链表
1、无序合并
声明一个新的链表,依次遍历所有待合并的链表,每个链表中的元素全部放到新联表中。
代码如下:
关于导入的头文件和参考:slinklist
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:cfl
@file:合并多个链表.py
@time:2021/12/21
@software:PyCharm
"""
# 这里的链表并不是有序的,
from slinklist import SlinkList
def concat(lista):
slink = SlinkList()
for ll in lista:
sllv = ll.display()
for v in sllv:
slink.appendtail(v)
return slink
def main():
sll1 = SlinkList()
sll2 = SlinkList()
for i in range(1, 6):
sll1.appendtail(i)
sll2.appendtail(i * i)
lst = [sll1, sll2]
newlinklist = concat(lst)
print(newlinklist.display())
if __name__ == '__main__':
main()
结果如下:
2、有序合并
将两个有序链表合并成一个链表,合并后依然有序。
以升序链表为例:
- 声明一个新链表
- 定义两个指针,分别指向两个有序链表
- 将两个指针指向的值进行比较,谁指向的值小则谁放进新链表中,然后该指针后移
- 当一个指针到达尾部时,将另一个指针的链表剩余元素依次入新链表
代码如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:cfl
@file:合并两个有序链表.py
@time:2021/12/21
@software:PyCharm
"""
# 合并有序链表,经典问题
# 将两个有序链表合并成一个,让新链表依然是有序的
from slinklist import SlinkList
def orderconcat(a,b):
pa=a.phead
pb=b.phead
c=SlinkList()
while pa!=None and pb!=None:
if pa.data<pb.data:
c.appendtail(pa.data)
pa=pa.next
else:
c.appendtail(pb.data)
pb=pb.next
while pa!=None:
c.appendtail(pa.data)
pa=pa.next
while pb!=None:
c.appendtail(pb.data)
pb=pb.next
return c
def main():
a=SlinkList()
b=SlinkList()
for i in [1,3,16,27,49]:
a.appendtail(i)
for i in [4,7,22,45,90]:
b.appendtail(i)
neworderlinklist=orderconcat(a,b)
print(neworderlinklist.display())
if __name__ == '__main__':
main()
结果如下: