思路
先思考下面三個問題:
- 條件:兩個有序鏈表(遞增),目的:合併成不遞減(含相等)的鏈表
- 需要幾個指針:這個問題應該從在循環時斷不斷鏈,要不要保留信息考慮
- 如何去循環
具體操作
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)