LeetCode 合并两个有序链表

103 阅读2分钟

LeetCode 合并两个有序链表

合并两个有序链表(Merge Two Sorted Lists)是LeetCode中比较基础的一道题目,也是面试中经常出现的问题,本文将分几个部分对这道题进行详细的讲解和分析。

  1. 题目描述

题目描述如下:

将两个升序链表合并为一个新的升序链表,并返回新链表。

输入:

l1 = [1,2,4], l2 = [1,3,4]

输出:

[1,1,2,3,4,4]

  1. 思路分析

简化题意,将两个有序链表合并成一个新的升序链表。

从这个题目可以看出,两个链表都是升序的,为了使合并后的链表也是升序的,我们可以采用双指针法解决这个问题。

定义两个指针,一个指针指向l1,另一个指针指向l2,然后比较两个指向节点的值的大小,将较小的节点加入到新链表中,同时移动相应的指针,重复这个过程直到有一个链表为空,然后将另一个链表剩余的节点加入到新链表中即可。

  1. 代码实现

下面是代码实现的Java版本:

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    ListNode merged = new ListNode(0);  // 新链表的头节点
    ListNode tail = merged;  // 指向新链表最后一个节点的指针

    while (l1 != null && l2 != null) {  // 比较两个链表的节点值
        if (l1.val < l2.val) {
            tail.next = l1;
            l1 = l1.next;
        } else {
            tail.next = l2;
            l2 = l2.next;
        }
        tail = tail.next;
    }

    if (l1 != null) {  // 将剩余节点添加到新链表中
        tail.next = l1;
    }

    if (l2 != null) {
        tail.next = l2;
    }

    return merged.next;
}

这段代码中,定义了一个新链表的头节点(merged)和一个指向新链表最后一个节点的指针(tail),然后遍历两个有序链表,比较当前两个链表节点的大小,将较小的节点接到新链表的尾部,并移动相应的链表指针,最后将剩余的节点拼接到新链表中。

  1. 时间复杂度

时间复杂度是O(m+n),其中m和n分别为两个有序链表的长度,因为每个节点最多只会被遍历一次。

  1. 总结

通过本篇文章,我们可以学习到在LeetCode中,如何用Java实现合并两个有序链表,以及双指针法的思路和应用。在实际面试中,需要掌握此类链表相关的算法,以便更好地应对面试。