leetcode 合併兩個有序連結串列 python3
阿新 • • 發佈:2018-12-19
一、非遞迴解法
1.思路:因為無法得到連結串列的長度,因此使用while迴圈判斷兩個連結串列的各個節點的值,取較小的值,然後直到有一個連結串列為空,迴圈結束,在迴圈結束時,判斷哪個連結串列為空,則直接在連結串列的head節點上加上即可
2.程式碼
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def mergeTwoLists(self, l1, l2): head=ListNode(0) first=head while l1!=None and l2!=None: if l1.val<=l2.val: head.next=ListNode(l1.val) l1=l1.next else: head.next=ListNode(l2.val) l2=l2.next head=head.next if l1!=None: head.next=l1 if l2!=None: head.next=l2 return first.next
3.總結:在建立head指標和first指標時,注意先後順序:是先建立head為0的指標,然後將first指標指向head的節點,然後在合併連結串列過程中將各個值賦給head的next,最後返回first的next
二、遞迴解法
1.遞迴的結束肯定是有一個連結串列或者兩個連結串列同時為空,根據情況判斷應該返回那個連結串列,在遞迴過程中判斷兩個連結串列各個的值,若連結串列1小,則遞迴呼叫,引數變化為l.next和2,繼續執行函式,同時返回l,這將是最後的連結串列的構成,執行的總過程會是下面的形式:l1:1->2->7 l2:1->2
l1.next=l2.next=l1.next(此時的l1已經是l1.next.next)=l2.next(同理)=l1(從後往前依次執行)
最終返回l1
2程式碼
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def mergeTwoLists(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ if l1==None and l2==None: return None if l1==None: return l2 if l2==None: return l1 if l1.val<=l2.val: l1.next=self.mergeTwoLists(l1.next,l2) return l1 else: l2.next=self.mergeTwoLists(l1,l2.next) return l2