算法leetcode|21. 合并两个有序链表(rust重拳出击)

Posted 二当家的白帽子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法leetcode|21. 合并两个有序链表(rust重拳出击)相关的知识,希望对你有一定的参考价值。


文章目录


21. 合并两个有序链表:

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

样例 1:

输入:
	l1 = [1,2,4], l2 = [1,3,4]
	
输出:
	[1,1,2,3,4,4]

样例 2:

输入:
	l1 = [], l2 = []
	
输出:
	[]

样例 3:

输入:
	l1 = [], l2 = [0]
	
输出:
	[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1l2 均按 非递减顺序 排列

原题传送门:

https://leetcode.cn/problems/merge-two-sorted-lists/


分析:

  • 面对这道算法题目,二当家的陷入了沉思。
  • 合并有序链表或者合并有序数组非常像归并排序的合并部分。
  • 递归和迭代都可以,通常递归更加简单直观,迭代更加高效。

题解:

rust

// Definition for singly-linked list.
// #[derive(PartialEq, Eq, Clone, Debug)]
// pub struct ListNode 
//   pub val: i32,
//   pub next: Option<Box<ListNode>>
// 
//
// impl ListNode 
//   #[inline]
//   fn new(val: i32) -> Self 
//     ListNode 
//       next: None,
//       val
//     
//   
// 
impl Solution 
    pub fn merge_two_lists(list1: Option<Box<ListNode>>, list2: Option<Box<ListNode>>) -> Option<Box<ListNode>> 
        match (list1, list2) 
            (None, None) => None,
            (None, r) => r,
            (l, None) => l,
            (Some(mut l), Some(mut r)) => 
                if l.val <= r.val 
                    l.next = Self::merge_two_lists(l.next, Some(r));
                    Some(l)
                 else 
                    r.next = Self::merge_two_lists(Some(l), r.next);
                    Some(r)
                
            
        
    


go

/**
 * Definition for singly-linked list.
 * type ListNode struct 
 *     Val int
 *     Next *ListNode
 * 
 */
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode 
    if nil == list1 
		return list2
	

	if nil == list2 
		return list1
	

	if list1.Val < list2.Val 
		list1.Next = mergeTwoLists(list1.Next, list2)
		return list1
	 else 
		list2.Next = mergeTwoLists(list1, list2.Next)
		return list2
	


c++

/**
 * Definition for singly-linked list.
 * struct ListNode 
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) 
 *     ListNode(int x) : val(x), next(nullptr) 
 *     ListNode(int x, ListNode *next) : val(x), next(next) 
 * ;
 */
class Solution 
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) 
        if (!list1) 
            return list2;
        

        if (!list2) 
            return list1;
        

        if (list1->val < list2->val) 
            list1->next = mergeTwoLists(list1->next, list2);
            return list1;
         else 
            list2->next = mergeTwoLists(list1, list2->next);
            return list2;
        
    
;

c

/**
 * Definition for singly-linked list.
 * struct ListNode 
 *     int val;
 *     struct ListNode *next;
 * ;
 */


struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
    if (!list1) 
        return list2;
    

    if (!list2) 
        return list1;
    

    if (list1->val < list2->val) 
        list1->next = mergeTwoLists(list1->next, list2);
        return list1;
     else 
        list2->next = mergeTwoLists(list1, list2->next);
        return list2;
    


python

# 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 list1 is None:
            return list2
        if list2 is 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


java

/**
 * Definition for singly-linked list.
 * public class ListNode 
 *     int val;
 *     ListNode next;
 *     ListNode() 
 *     ListNode(int val)  this.val = val; 
 *     ListNode(int val, ListNode next)  this.val = val; this.next = next; 
 * 
 */
class Solution 
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) 
        if (list1 == null) 
            return list2;
        

        if (list2 == null) 
            return list1;
        

        if (list1.val < list2.val) 
            list1.next = mergeTwoLists(list1.next, list2);
            return list1;
         else 
            list2.next = mergeTwoLists(list1, list2.next);
            return list2;
        
    


非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


以上是关于算法leetcode|21. 合并两个有序链表(rust重拳出击)的主要内容,如果未能解决你的问题,请参考以下文章

算法热门:合并两个有序链表(LeetCode 21)

LeetCode(算法)- 21. 合并两个有序链表

LeetCode(算法)- 21. 合并两个有序链表

LeetCode Algorithm 21. 合并两个有序链表

LeetCode Algorithm 21. 合并两个有序链表

LeetCode 21. 合并两个有序链表