方法一和方法二的执行效率,可以大致的计算时间复杂度加以对比,方法一优于方法二
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