JZ25 合并两个排序的链表

80 阅读1分钟

[](题解 | #合并两个排序的链表#_牛客博客 (nowcoder.net))

# 合并两个排序的链表
class Node:
    def __init__(self, element=None):
        self.element = element
        self.next = None


class Show_Node:
    # 根据输入的列表创建链表
    def single_link(self, list_):
        if not list_:
            return Node()
        for index, value in enumerate(list_):
            if index == 0:  # 首元素的插入
                head = Node(value)
                cur_ = head
            else:  # 后续元素的插入
                cur_.next = Node(value)
                cur_ = cur_.next
        return head

    # 以列表的形式查看链表
    def traverse(self, node):
        list_ = []
        while node is not None:  # 遍历所有节点
            list_.append(node.element)  # 结点元素填入列表
            node = node.next
        return list_

    # 计算链表长度
    def length_link(self, node):
        cur = node
        len_ = 0  # 计数
        while cur is not None:  # 遍历所有节点
            len_ += 1  # 计数
            cur = cur.next  # cur指向下一个节点
        return len_


class Solution:
    # 返回合并后列表
    def Merge(self, pHead1, pHead2):
        # write code here
        if not pHead1:
            return pHead2
        if not pHead2:
            return pHead1
        if pHead1.element <= pHead2.element:
            pMerge = pHead1
            pMerge.next = self.Merge(pHead1.next, pHead2)
        else:
            pMerge = pHead2
            pMerge.next = self.Merge(pHead1, pHead2.next)
        return pMerge


show_code = Show_Node()
l1 = show_code.single_link([1, 4, 5])
l2 = show_code.single_link([2, 3, 9])
s = Solution()
r = s.Merge(l1, l2)
print(show_code.traverse(r))
print(show_code.length_link(r))