Leetcode-21 合并两个有序链表

作者: itbird01 | 来源:发表于2021-09-22 11:05 被阅读0次

21. 合并两个有序链表

解题思路

解法1:

1.遍历两个有序链表,结束条件为L1、L2都为null
2.对每次遍历到的数据做判断,区分三种情况:
1)L1、L2都不为空--判断此时两个val的大小,创建node
2)L1不为空、L2为空--用L1的val创建node
3)L1为空、L2不为空--用L2的val创建node
3.创建链表的过程中,需要注意,头结点为空时,需要先创建头结点

解法2

1.巧妙运用哑结点的技巧,解决头结点为空的问题
2.将哑结点的链表初始化为L1
3.遍历L2,找到哑结点所在链表合适位置,插入数据
4.返回哑结点的next即为ans

解题遇到的问题

1.创建链表的过程中,需要注意,头结点为空时,需要先创建头结点

后续需要总结学习的知识点

1.链表的遍历、插入、删除、添加,自己通过java代码实现

##解法1
class Solution {
    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode result = null;
        ListNode head = result;
        while (l1 != null || l2 != null) {
            int val = 0;
            if (l1 != null && l2 != null) {
                if (l1.val > l2.val) {
                    val = l2.val;
                    l2 = l2.next;
                } else {
                    val = l1.val;
                    l1 = l1.next;
                }
            } else if (l1 == null && l2 != null) {
                val = l2.val;
                l2 = l2.next;
            } else if (l2 == null && l1 != null) {
                val = l1.val;
                l1 = l1.next;
            }

            if (head == null) {
                result = new ListNode(val);
                head = result;
            } else {
                ListNode temp = new ListNode(val);
                result.next = temp;
                result = result.next;
            }
        }
        return head;
    }
}

##解法2
class Solution {
    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode node = new ListNode(0);
        ListNode ans = node;
        node.next = l1;
        ListNode pre = node;
        node = node.next;
        while (l2 != null) {
            while (node != null) {
                if (node.val >= l2.val) {
                    break;
                }
                pre = node;
                node = node.next;
            }
            if (node != null) {
                ListNode temp = new ListNode(l2.val);
                temp.next = pre.next;
                pre.next = temp;
            } else {
                pre.next = new ListNode(l2.val);
            }
            pre = pre.next;
            l2 = l2.next;
        }
        return ans.next;
    }

    public static class ListNode {
        int val;
        ListNode next;
        ListNode() {
        }
        ListNode(int val) {
            this.val = val;
        }
        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }
}

相关文章

  • 面试常会问到的基础链表和二叉树题目总结

    记录一下几道常见的 leetcode 题目的解法,都是比较基础的题目。 leetcode-21:合并两个有序链表 ...

  • leecode刷题(23)-- 合并两个有序链表

    leecode刷题(23)-- 合并两个有序链表 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回。新...

  • 合并单链表

    合并两个有序链表非递归实现 合并两个有序链表递归实现

  • leetcode 链表 [C语言]

    21. 合并两个有序链表 合并两个有序链表 61. 旋转链表 (快慢指针) 61. 旋转链表 相关标签 : 链表 ...

  • LeetCode-21 合并两个有序链表

    题目:21. 合并两个有序链表 难度:简单 分类:链表 解决方案:链表的遍历 今天我们学习第21题合并两个有序链表...

  • Leetcode-21:合并两个有序链表

    题目描述:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例:输入...

  • Leetcode-21 合并两个有序链表

    21. 合并两个有序链表[https://leetcode-cn.com/problems/merge-two-s...

  • ARTS-Week6 有序链表合并、DevOps、Json解析、

    Algorithm LeetCode原题链接: 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回。新链...

  • 2018-12-26

    问题列表 合并两个有序链表 合并K个排序链表 合并区间 插入区间 问题与反馈 总结与收获 多个有序链表的合并,类似...

  • leetcode的题目21

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

网友评论

    本文标题:Leetcode-21 合并两个有序链表

    本文链接:https://www.haomeiwen.com/subject/wsqhgltx.html