1. 程式人生 > >leetcode 合併兩個有序連結串列 python3

leetcode 合併兩個有序連結串列 python3

一、非遞迴解法

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