6_leetcode力扣_21合并两个有序链表_MergeTwoSortedLists_Easy

题目

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

难度

简单

相关知识

递归 链表

题解

  1. 暴力合并法
    在这里插入图片描述
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        if not list1:
            return list2
        if not list2:
            return list1

        result = ListNode(0) #创建一个结尾链表
        head = result #创建一个
		# l1 和 l2 都未遍历结束
        while list1 and list2:
            if list1.val <= list2.val:
                head.next=list1
                list1=list1.next
            else:
                head.next=list2
                list2=list2.next
            head = head.next# 移动 结果链表 的结尾指针

        if list1:
            head.next = list1 
        else:
            head.next = list2
        
        return result.next

在这里插入图片描述
这里的哑节点在本题中指result,不可移动;move游标指head,每迭代一次即刷新并继续往下走。
以输入[1,2,4][1,3,4]为例

每次在while循环中执行head = head.next的结果为:

ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 4, next: None}}}
ListNode{val: 1, next: ListNode{val: 3, next: ListNode{val: 4, next: None}}}
ListNode{val: 2, next: ListNode{val: 4, next: None}}
ListNode{val: 3, next: ListNode{val: 4, next: None}}
ListNode{val: 4, next: None}

可以清晰看到list1一步步的变化:

ListNode{val: 2, next: ListNode{val: 4, next: None}}
ListNode{val: 2, next: ListNode{val: 4, next: None}}
ListNode{val: 4, next: None}
ListNode{val: 4, next: None}
None

最后的head为:

ListNode{val: 4, next: ListNode{val: 4, next: None}}

最后的result为:

ListNode{val: 0, next: ListNode{val: 1, next: ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: ListNode{val: 4, next: ListNode{val: 4, next: None}}}}}}}

所以要return result.next

与本人刷的第二题用了一样的方法。

  1. 递归
    在这里插入图片描述

两个链表头部值较小的一个节点与剩下元素的 merge 操作结果合并。

  • 终止条件:当 l1 为空或 l2 为空时
  • 返回值:每一层调用都返回排序好的链表头
  • 本级递归内容:如果 l1 的 val 值更小,则将 l1.next 与排序好的链表头相接,l2 同理
class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        if not list1:
            return list2
        if not list2:
            return list1
            
        if list1.val <= list2.val:
            list1.next = self.mergeTwoLists(list1.next,list2)
            return list1 
			#第一次判定时可以确定最后结果的第一个节点是来自条链表的,此后的return都做连接线用。
        else:
            list2.next = self.mergeTwoLists(list1,list2.next)
            return list2 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值