[leetcode] 21. 合并两个有序链表

文章目录

  • 题目描述
  • 解题方法
    • 双指针遍历
      • java代码

题目描述

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

示例 1:
[leetcode] 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 均按 非递减顺序 排列

解题方法

双指针遍历

为了方便返回链表后的头结点,我们设置一个哑结点(dummyNode),哑结点的next指针指向升序链表的头结点。

已知两个链表都是升序链表,我们初始设置指针p指向哑结点,指针l1l2分别指向两个链表的头结点,此时最小的元素必然在l1.vall2.val之间,若最小元素是l1.val,则将pnext指针指向l1的结点,p也重新指向l1的结点,l1指针指向l1.next的结点;若最小元素是l2.val,则将pnext指针指向l2的结点,p也重新指向l2的结点,l2指针指向l2.next的结点。下一个最小的元素也必然在l1.vall2.val之间,还是按照上面的方法让l1l2的指针不断往后遍历。直到l1或者l2遍历到末尾时,pnext指针指向l1l2之中还没有遍历到末尾的指针。此时,返回哑结点的next结点即为升序链表的头结点。

java代码

ListNode结构

public class ListNode {
    public int val;
    public ListNode next;

    public ListNode() {
    }

    public ListNode(int val) {
        this.val = val;
    }

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

链表合并方法

public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
    ListNode dummyNode = new ListNode(0, null);
    ListNode p = dummyNode;
    ListNode l1 = list1;
    ListNode l2 = list2;
    while (l1 != null && l2 != null) {
        if (l1.val <= l2.val) {
            p.next = l1;
            p = p.next;
            l1 = l1.next;
        } else {
            p.next = l2;
            p = p.next;
            l2 = l2.next;
        }
    }
    if (l1 != null) {
        p.next = l1;
    } else {
        p.next = l2;
    }
    return dummyNode.next;
}

时间复杂度: O ( M + N ) O(M+N) O(M+N) M M M N N N为两个链表的长度
空间复杂度: O ( 1 ) O(1) O(1)


  • 个人公众号
    个人公众号
  • 个人小游戏
    个人小游戏

你可能感兴趣的:(leetcode,链表,算法,数据结构)