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

猜你喜欢

转载自blog.csdn.net/weixin_44441131/article/details/106932608