• 牛客网:将两个单调递增的链表合并为一个单调递增的链表-Python实现-两种方法讲解


    方法一和方法二的执行效率,可以大致的计算时间复杂度加以对比,方法一优于方法二

     

    1. 方法一:

      思路:

        1. 新创建一个链表节点头,假设这里就叫 head3;

        2. 因为另外两个链表都为单调递增,所以每次对比这两个链表的第一个节点的值,取出值较小的节点,把其放在 head3 链表的末尾,并在原链表中删除被取出的节点;

        3. 直到把原两链表的其中一个链表的所有节点都取走;

        4. 把还存有节点的链表整个的追加到 head3 链表的结尾,到此便形成一个节点值从小到大排列的 head3 链表;

      代码实现:

     1 # -*- coding:utf-8 -*-
     2 # class ListNode:
     3 #     def __init__(self, x):
     4 #         self.val = x
     5 #         self.next = None
     6 class Solution:
     7     # 返回合并后列表
     8     def Merge(self, pHead1, pHead2):
     9         # write code here
    10         head = ListNode(22)
    11         p = head  # p用来当做循环操作的指针
    12         # 当两个链表全都不为空,执行循环
    13         while pHead1 and pHead2:
    14             if pHead1.val <= pHead2.val:
    15                 p.next = pHead1
    16                 # 从pHead1中取出头结点时,头结点变为原头结点的next节点
    17                 pHead1 = pHead1.next    
    18             elif pHead1.val > pHead2.val:
    19                 p.next = pHead2
    20                 pHead2 = pHead2.next    # 同理
    21             p = p.next    # 每次向head3追加一个节点时,指针p偏倚
    22         # 如果pHead1不为None,直接把剩下的pHead1追加到pHead3后
    23         while pHead1:
    24             p.next = pHead1
    25             pHead1 = pHead1.next
    26             p = p.next
    27         # 同理
    28         while pHead2:
    29             p.next = pHead2
    30             pHead2 = pHead2.next
    31             p = p.next
    32         # 返回的结果,去掉head3创建时的无意义首节点
    33         return head.next
    34                 
      

    2. 方法二

      思路:

        1. 初始化一个空列表;

        2. 对比两个递增链表的首节点,将节点值小的节点取出追加到列表的末尾,同时从原链表中删除被取出的节点;

        3. 直到把两个链表中的节点都取没,列表中就包含了原来两个链表中所有的节点,并且是一个递增的列表;

        4. 最后,使列表中的第 n 个元素的 next 指向列表的第 n+1 个元素,n 的取值为 0~(n-2),n-1为列表的最后一个元素,使其 next 指向 None;

        5. 到此,便形成了一个合并后的递增链表

      代码实现:

     1 # -*- coding:utf-8 -*-
     2 # class ListNode:
     3 #     def __init__(self, x):
     4 #         self.val = x
     5 #         self.next = None
     6 class Solution:
     7     # 返回合并后列表
     8     def Merge(self, pHead1, pHead2):
     9         # write code here
    10         ls = []
    11         # 取出两个链表中头节值较小的节点,追加到ls末尾
    12         while pHead1 or pHead2:
    13             # 当pHead1链表所有节点被取光的情况
    14             if pHead1 == None:
    15                 ls.append(pHead2)
    16                 pHead2 = pHead2.next
    17             # 同理
    18             elif pHead2 == None:
    19                 ls.append(pHead1)
    20                 pHead1 = pHead1.next
    21             elif pHead1.val <= pHead2.val:
    22                 ls.append(pHead1)
    23                 pHead1 = pHead1.next
    24             elif pHead1.val > pHead2.val:
    25                 ls.append(pHead2)
    26                 pHead2 = pHead2.next
    27         # 如果ls为空,说明原两链表都为空,return None
    28         if ls == []:
    29             return None
    30         # 除了列表的最后一个元素,使每个元素的next指向其下一个
    31         for i in range(len(ls)-1):
    32             ls[i].next = ls[i+1]
    33         # 列表最后一个元素的next指向None
    34         ls[len(ls)-1].next = None
    35         # 返回结果
    36         return ls[0]
    37                 
  • 相关阅读:
    在新浪爱问上看到的有趣名字都记下来
    FastReports_4.14.1 _Cliff手动安装
    计算机算法对做事效率的启发(既要高强度猛攻,也要细水长流)
    有趣的数组
    listView 分页加载数据
    如何隐藏Cognos Viewer
    使用DBUnit实现对数据库的测试
    通过Jasmine和Guard自动测试JavaScript
    for惠普2013实习生
    栈的顺序存储,所谓的顺序栈
  • 原文地址:https://www.cnblogs.com/springionic/p/10663180.html
Copyright © 2020-2023  润新知