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

leetcode21:合併兩個有序連結串列

思想:
一.定義函式listTolistNode(列表轉連結串列)
1.初始化兩個一樣的連結串列head和dumpy
2.依次取列表y的元素,並呼叫ListNode函式得到l1
3.將l1的地址賦值給head.next(由於head和dumpy地址一樣,即head.next就是dumpy.next)
4.將head.next裡的地址賦值給head的地址,並且跳轉2直到取完列表y的所有元素
5.將dumpy.next裡地址賦值給dumpy地址,從而去除初始化的地址
二.定義函式listNodeTolist(連結串列轉列表)
1.將連結串列z地址的z.val新增進list,然後將z.next地址賦值給z地址,從而更新z。跳轉1直到z為空
三.定義函式mergeTwoLists(合併兩個有序連結串列)
1.初始化兩個一樣的連結串列head和dumpy
2.當l1和l2都不會空時,比較連結串列l1的l1.val和連結串列l2的l2.val大小。若l1.val小則轉3,反之轉4。若其一為空則轉6
3.將l1地址賦值給head.next,l1.next裡的地址賦值給l1
4.將l2地址賦值給head.next,l2.next裡的地址賦值給l2
5.將head.next裡的地址賦值給head,轉2
6.判斷l1是否為空,若否,將l1的地址賦值給head.next,否則轉7
7.判斷l2是否為空,若否,將l2的地址賦值給head.next,否則結束

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution(object):
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        head = dummy = ListNode(-1)
        while l1 and l2:
            if l1.val < l2.val:
                head.next = l1
                l1 = l1.next
            else:
                head.next = l2
                l2 = l2.next
            head = head.next
        if l1:
            head.next = l1
        if l2:
            head.next = l2
        return dummy.next

    def listTolistNode(self, y):
        """
        :type y: List
        :rtype: ListNode
        """
        head = dumpy = ListNode(-1)
        for i in y:
            l1 = ListNode(i)
            head.next = l1
            head = head.next
        return dumpy.next

    def listNodeTolist(self, z):
        list = []
        while z:
            list.append(z.val)
            z = z.next
        return list


print(Solution.listNodeTolist(Solution,Solution.mergeTwoLists(Solution,Solution.listTolistNode(Solution,[1,2,4]),Solution.listTolistNode(Solution,[1,3,4]))))