剑指offer编程题python实现(第16题)合并两个排序的链表
题目描述
输入两个单调递增的链表,
输出两个链表合成后的链表,
当然我们需要合成后的链表满足单调不减规则。
'''题目描述
输入两个单调递增的链表,
输出两个链表合成后的链表,
当然我们需要合成后的链表满足单调不减规则。
'''
# -*- coding:utf-8 -*-
# 定义链表结点类
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
# 返回合并后列表头
def Merge(self, pHead1, pHead2):
# 如果pHead1 为空链表
if pHead1 is None:
# 返回pHead2
return pHead2
# 如果pHead2 为空链表
if pHead2 is None:
# 返回pHead1
return pHead1
#两个链表都是递增的,所以要判断两个链表的第一个元素的大小
# 将首节点大的链表的的所有元素插入到首节点小的那个链表中
# 第一个元素小的那个为最后要返回的合并后的链表
if pHead1.val <= pHead2.val:
# print('a',pHead1.val)
pmerge = pHead1
else:
# print('b', pHead2.val)
# pmerge = pHead2
pHead1,pHead2 = pHead2,pHead1
pmerge = pHead1
pre = None
p1 = pHead1
p2 = pHead2
while p1 and p2:
# 从头开始判断,两个都不为空,才能进入循环
if p1.val <= p2.val:
# 如果p2结点的值大于怕p1结点
# p1指针向后移
pre = p1
p1 = p1.next
else:
# p2所指的元素小于p1所指的元素,将p2插入到p1的前面
cur = p2
# p2向后移动一个结点
p2 = p2.next
cur.next=p1
pre.next = cur
pre = cur
# 只要有一个链表到了末尾,都会跳出循环
# 如果是因为p2到了末尾,说明p2上的所有结点都已经插入到p1上的合适位置
if p2 is None:
# 返回pmerge
return pmerge
# 如果p1到了末尾,p2还有结点,说明p2剩余的结点都是大于等于p1
# 尾结点的
if p1 is None:
# 将剩余的p2接在p1的末尾即可
pre.next = p2
# 返回pmerge
return pmerge
# 下面来测试程序
if __name__ == '__main__':
sut = Solution()
# 生成递增的第一个链表
phead1 = ListNode(3)
p1 = phead1
for i in range(4,6):
node = ListNode(i)
phead1.next = node
phead1 = phead1.next
# 生成递增的第二个链表
phead2 = ListNode(2)
p2 = phead2
for j in range(4,11,2):
node = ListNode(j)
phead2.next = node
phead2 = phead2.next
# 调用
MergeHead = sut.Merge(p1,p2)
# 打印出返回的合并后的链表
while MergeHead:
print('merge',MergeHead.val)
MergeHead = MergeHead.next