1. 程式人生 > >16.合併兩個排序的連結串列-劍指offer-Python2.7

16.合併兩個排序的連結串列-劍指offer-Python2.7

題目描述 輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則。

思路1 首先,我們要找到新連結串列的首節點new_head,new_head為兩個給定連結串列首節點元素的較小值。接著,不斷地將給定連結串列中的較小的節點元素加入到新連結串列中,直到其中一個連結串列到達尾結點,即這個連結串列遍歷完畢。然後,我們把另外一個連結串列中剩餘的節點加入到新連結串列中,至此,完成了兩個單調遞增連結串列的合併。程式碼魯棒性:輸入的兩個連結串列中可能有空連結串列,所以要先進行判斷。

Python2.7編寫

# -*- coding:utf-8 -*-
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
        
class Solution:
    # 返回合併後列表
    def Merge(self, pHead1, pHead2):
        #如果pHead1為空連結串列,則直接返回pHead2
        if not pHead1:
            return pHead2
        #如果pHead2為空連結串列,則直接返回pHead1
        if not pHead2:
            return pHead1
        
        p1 = pHead1
        p2 = pHead2
        #先找到合併後連結串列的首節點,用new_head儲存
        if p1.val <= p2.val:
            new_head = ListNode(p1.val)
            p1 = p1.next
        else:
            new_head = ListNode(p1.val)
            p2 = p2.next
            
        #用另一個指標p指向新的首節點   
        p = new_head
        #不斷地將兩個連結串列中較小的元素節點加入到新連結串列中,直到其中一個連結串列到達尾結點
        while p1 and p2:
            if p1.val <= p2.val:
                p.next = ListNode(p1.val)
                p = p.next
                p1 = p1.next
            else:
                p.next = ListNode(p2.val)
                p = p.next
                p2 = p2.next
        #將還沒有到達尾結點的連結串列中剩餘的元素加入到新連結串列中       
        while p1 or p2:
            if p1 is not None:
                while p1:
                    p.next = ListNode(p1.val)
                    p = p.next
                    p1 = p1.next
            if p2 is not None:
                while p2:
                    p.next = ListNode(p2.val)
                    p = p.next
                    p2 = p2.next
        return new_head

思路2 遞迴 我們發現每次都是兩個連結串列中的節點進行比較,這是一個重複的過程,可以用遞迴的方法解決。

Python2.7編寫

# -*- coding:utf-8 -*-
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
        
class Solution:
    # 返回合併後列表
    def Merge(self, pHead1, pHead2):
        #其中一個連結串列遍歷完畢或者給定連結串列中有空連結串列
        if pHead1 == None:
            return pHead2
        elif pHead2 == None:
            return pHead1
        
        new_head = None
        if pHead1.val <= pHead2.val:
            new_head = pHead1
            new_head.next = self.Merge(pHead1.next,pHead2)
        else:
            new_head = pHead2
            new_head.next = self.Merge(pHead1,pHead2.next)
        return new_head