剑指offer16 :合并两个排序链表

在这里插入图片描述
在这里插入图片描述

思路

先思考下面三个问题

  1. 条件:两个有序链表(递增),目的:合并成不递减(含相等)的链表
  2. 需要几个指针:这个问题应该从在循环时断不断链,要不要保留信息考虑
  3. 如何去循环

具体操作

0.先判断给定链表尾空的情况

1.比较两个链表中的第一个结点,将值较小的作为新链表的头节点new_Head,这里需要一个指针用来返回链表

2.定义两个指针(pTempt,qTempt)分别指向原始的两个链表的头节点,并根据第一步执行
pTemp=pTempt.next或者qTempt=qTempt.next,因为第一步已经执行了一次比较。(到此共计3个指针)

3.判断pTempt和qTempt移动时是否存在断链的情况,由于我们不需要插入或者删除的操作,所以没有断链的操作,所以不需要另外定义指针指向它们的后继结点来保存信息。

4.向new_Head链表中添加结点,通过循环,由于new_Head是要返回的链表的头节点,我们不能动,所以要定义一个指针previousPointer指向new_Head,使其可以添加结点。(至此,共计4个指针)

5.循环结束后,考虑一个链表遍历空了,另一个没空。这时,将没空的直接接在新链表的后面即可。

6.返回new_Head

代码

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        # write code here
        if pHead1 == None and pHead2:
            return pHead2
        if pHead2 == None and pHead1:
            return pHead1
        if pHead1 == None and pHead2 == None:
            return None
        
        new_Head = pHead1 if pHead1.val < pHead2.val else pHead2
        
        pTempt = pHead1
        qTempt = pHead2
        previousPointer = new_Head
        
        if new_Head == pTempt:
            pTempt = pTempt.next
        else:
            qTempt = qTempt.next
            
            
        while pTempt and qTempt:
            if pTempt.val < qTempt.val:
                previousPointer.next = pTempt
                pTempt = pTempt.next
            else:
                previousPointer.next = qTempt
                qTempt = qTempt.next
                
            previousPointer = previousPointer.next
            
        if pTempt == None:
            previousPointer.next = qTempt
        else:
            previousPointer.next = pTempt
            
        return new_Head     

在这里插入图片描述

时间复杂度

假设两个链表的长度分别为m,n。链接操作为O(1),循环操作为O(m+n)=O(n),所以时间复杂度为O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

InceptionZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值