剑指offer编程题python实现(第16题)合并两个排序的链表

剑指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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值