算法代码1.合并两个有序链表

目录

解法一、暴力求解

(1)整体思路:

(2) 攻占城池记忆法:

解法二:递归思想

(1)需要着重注意的代码写法

(2)递归过程图解


解法一、暴力求解

(1)整体思路:

先设立一个哑结点,比较两个链表,若list1的头结点值小,就将哑结点指向list1的头结点,list1指向list1的下一个节点;第二次比较,list1的第二个节点和list2的头结点大小,若list2的头结点较小,就将哑结点指向list2的头结点,list2指向list2的下一个节点。

(2) 攻占城池记忆法:

哑结点占领小的那一个的城池,小的那一个别排挤到隔壁去;最后某个链表排挤到空处,此时跳出循环;cur的下一个指针赋给cur=cur.next,再判断哪个链表仍然存在值,就将下一个指针指向她,直接连接。因为都是有序的

class Solution(object):
    def mergeTwoLists(self, list1, list2):
        # 若其中任一个链表为空,返回另一个
        if not list1:
            return list2
        if not list2:
            return list1
        # 由于对链表值的读取类似于指针,随着遍历的进行,指针不断往后,且最后并不会返回链表开头
        # 故此处应当设置一个所谓的哑节点,实际上可以理解为两个指针,一个始终指向链表头部用于返
        # 回整个链表,一个遍历链表,进行指定的操作
        res = cur = ListNode(-1)
        # 当两个链表都不为空时,开始遍历并各自读取节点值比较
        while list1 and list2:
            # 若链表1当前节点值大于链表2当前节点值,新链表的新节点值为链表2的当前节点值(较小的
            # 那个)
            if list1.val>list2.val:
                cur.next = list2
                # 继续遍历当前值较小的链表,指针指向下一个待比较节点
                list2 = list2.next
            # 否则与前述操作相反
            else:
                cur.next = list1
                list1 = list1.next
            # 新链表指针指向新节点,用于更新链表
            cur = cur.next
        # 最后判断一下还有没有链表没遍历完的,由于是升序链表,直接添加到新链表后面即可
        cur.next = list1 if list1 else list2
        # 返回哑节点后面的链表节点
        return res.next

解法二:递归思想

def mergeTwoLists(self, list1, list2):
        if list1 == None:
            return list2
        if  list2 == None:
            return list1
        if list1.val < list2.val:
            list1.next = self.mergeTwoLists(list1.next,list2)
            return list1
        else:
            list2.next = self.mergeTwoLists(list1,list2.next)
            return list2

(1)需要着重注意的代码写法

def mergeTwoLists(self, list1, list2):
        if list1 == None:                    # 或者写法if not list1:return list2
            return list2
        if  list2 == None:
            return list1
        if list1.val < list2.val:
            list1.next = self.mergeTwoLists(list1.next,list2)
            return list1
        else:
            list2.next = self.mergeTwoLists(list1,list2.next)
            return list2

整体思路:用小指针指向后续的链表,后续的链表继续返回调用;list1,.next和list2对比,再找出小的那个指针,指向后续链表。

(2)递归过程图解

算法代码1.合并两个有序链表_第1张图片

算法代码1.合并两个有序链表_第2张图片

算法代码1.合并两个有序链表_第3张图片

算法代码1.合并两个有序链表_第4张图片

算法代码1.合并两个有序链表_第5张图片

算法代码1.合并两个有序链表_第6张图片

算法代码1.合并两个有序链表_第7张图片

算法代码1.合并两个有序链表_第8张图片

你可能感兴趣的:(算法之路,链表,数据结构,算法)