LeetCode_Linked List_Merge Two Sorted Lists

本文介绍了使用递归和非递归方式合并两个有序链表的实现方法,并提供了Java代码示例。

21.Merge Two Sorted Lists

题目


1. 问题描述:

合并两个有序链表,并返回一个新的有序链表。

2. 解决思路:

这道题很简单。可以用递归求解,也可以用非递归求解;注意:如果用非递归求解,发现新链表的头结点不确定,所以引入dummy节点。不多说之间上代码。

3. java代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {

        //递归
        /*ListNode ret = null;
        if(l1 == null) 
            return l2;
        if(l2 == null)
            return l1;

        if(l1.val > l2.val){
            ret = l2;
            ret.next = mergeTwoLists(l2.next,l1);
        } else {
            ret = l1;
            ret.next = mergeTwoLists(l1.next,l2);
        }
        return ret;*/

        /* 除了dummy节点外还引入一个lastNode节点充当下一次合并时的头节点。在l1或者l2的某一个节点为空指针NULL时,退出while循环,并将非空链表的头部链接到lastNode->next中。*/

        ListNode dummy = new ListNode(0);
        ListNode lastNode = dummy;
        while((l1!=null) && (l2!=null)){
            if(l2.val > l1.val){
                lastNode.next = l1;
                l1 = l1.next;
            } else {
                lastNode.next = l2;
                l2 = l2.next;
            }
            lastNode = lastNode.next;
        }

        lastNode.next = (l1!=null)?l1:l2;
        return dummy.next; 
    }
}

4. 算法评估:

这里写图片描述


希望大家多多指正交流!

合并两个有序链表的递归实现是一种直观且优雅的方法。该方法利用递归调用来逐步解决子问题,最终构建出完整的解决方案。以下是具体的实现步骤和原理: ### 递归实现原理 1. **递归边界条件**:如果其中一个链表为空,则直接返回另一个链表作为合并后的结果。 2. **递归调用**:比较两个链表当前节点的值,选择较小的节点作为新链表的当前节点,并递归地合并剩余部分。 ### 代码示例 ```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 not list1: return list2 if not list2: 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. **递归边界条件**: - 如果 `list1` 为空,则返回 `list2`。这是因为 `list2` 中的所有节点都已经按升序排列,可以直接接在结果链表后面。 - 如果 `list2` 为空,则返回 `list1`。理由同上,`list1` 的所有节点可以直接接在结果链表后面 [^3]。 2. **递归调用**: - 比较 `list1` 和 `list2` 当前节点的值,选择较小的节点作为当前节点。 - 如果 `list1.val` 小于或等于 `list2.val`,则递归调用 `mergeTwoLists` 函数,传入 `list1.next` 和 `list2`,并将返回的结果赋值给 `list1.next`,然后返回 `list1`。 - 否则,递归调用 `mergeTwoLists` 函数,传入 `list1` 和 `list2.next`,并将返回的结果赋值给 `list2.next`,然后返回 `list2` [^4]。 ### 示例 假设我们有两个链表: - `list1`: 1 -> 3 -> 5 - `list2`: 2 -> 4 -> 6 递归调用过程如下: 1. 比较 `list1.val` (1) 和 `list2.val` (2),选择 `list1` 的节点 1。 2. 递归调用 `mergeTwoLists(list1.next, list2)`,即 `mergeTwoLists(3 -> 5, 2 -> 4 -> 6)`。 3. 比较 `3` 和 `2`,选择 `list2` 的节点 2。 4. 递归调用 `mergeTwoLists(list1, list2.next)`,即 `mergeTwoLists(3 -> 5, 4 -> 6)`。 5. 继续这个过程,直到其中一个链表为空。 最终结果链表为:1 -> 2 -> 3 -> 4 -> 5 -> 6。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值