思路
先思考下面三个问题:
- 条件:两个有序链表(递增),目的:合并成不递减(含相等)的链表
- 需要几个指针:这个问题应该从在循环时断不断链,要不要保留信息考虑
- 如何去循环
具体操作
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)