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-21 合并两个有序链表

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