16.合併兩個排序的連結串列-劍指offer-Python2.7
阿新 • • 發佈:2018-12-21
題目描述 輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則。
思路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