美文网首页
【链表】合并两个有序链表

【链表】合并两个有序链表

作者: 修行者12138 | 来源:发表于2020-10-24 13:40 被阅读0次

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

    示例:

    输入:1->2->4, 1->3->4
    输出:1->1->2->3->4->4

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/merge-two-sorted-lists

    思路一(耗时1ms,超过60%)
    创建一个新的链表3,每次遍历链表1和链表2,都创建一个新节点,值为链表1和链表2的当前节点中较小值,把新节点插入链表3

    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 任意一个链表为空,则返回另一个
        if (null == l1 || null == l2) {
            return null == l1 ? l2 : l1;
        }
    
        ListNode head = new ListNode();
        ListNode point = head;
    
        while (null != l1 && null != l2) {
            // 值相等的时候优先取l1
            if (l1.val > l2.val) {
                point.val = l2.val;
                l2 = l2.next;
            } else {
                point.val = l1.val;
                l1 = l1.next;
            }
            point.next = new ListNode();
            point = point.next;
        }
    
        if (null != l1) {
            point.val = l1.val;
            point.next = l1.next;
        } else if (null != l2) {
            point.val = l2.val;
            point.next = l2.next;
        } else {
            point = null;
        }
    
        return head;
    }
    

    思路二(耗时0ms,超过100%)
    不用创建新的链表,只需创建几个节点指针,遍历链表1和链表2,每次把指针指向较小的节点

    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 任意一个链表为空,则返回另一个
        if (null == l1 || null == l2) {
            return null == l1 ? l2 : l1;
        }
    
        ListNode head = null;
        ListNode point = null;
    
        while (null != l1 && null != l2) {
            // 临时节点
            ListNode temp;
            // 值相等的时候优先取l1
            if (l1.val <= l2.val) {
                temp = l1;
                l1 = l1.next;
            } else {
                temp = l2;
                l2 = l2.next;
            }
    
            if (null == head) {
                point = temp;
                head = point;
            } else {
                point.next = temp;
                point = point.next;
            }
        }
    
        // 把l1和l2剩余部分拼接到point后面
        if (null != l1) {
            point.next = l1;
        } else if (null != l2) {
            point.next = l2;
        }
    
        return head;
    }
    
    image.png



    如果题目有说明要保证输入链表的稳定性,即不能破坏原链表的结构,就只能用思路一

    相关文章

      网友评论

          本文标题:【链表】合并两个有序链表

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