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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章