LeetCode集锦(七) - 第21题 Merge Two Sorted List

本文详细解析LeetCode第21题“合并两个有序链表”的解题思路与方法,通过遍历和拼接节点的方式,实现两个链表的合并,附带代码示例和复杂度分析。

LeetCode集锦(七) - 第21题 Merge Two Sorted List

问题

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 

 Example:

Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4



  public class ListNode {
      int val;
      ListNode next;
      ListNode(int x) { val = x; }
  }

复制代码

翻译:

合并两个已排序的链表,并将其作为一个新列表返回。新列表应该通过将前两个列表的节点拼接在一起来创建。
例子:
输入:1 - > 2 - > 4,1 - > 3 - > 4
输出:1 - > 1 - > 2 - > 3 - > 4 - > 4
数据格式:

public class ListNode {
     int val;
    ListNode next;
     ListNode(int x) { val = x; }
}
复制代码

解题思路

本题思路很简单,就是合并两个链表,通过遍历对方式,逐步把另外一个链合并到新的链里面去,我们这边需要额外到两个节点,一个是头节点,因为在遍历的时候需要保证链头还在,才可以返回数据。还有一个是遍历时,当前节点的前一节点。因为可能会插在前面的节点上。

解题方法

  1. 第一种解题方法,我这边使用了l1为基本链,把l2合并到l1中,新建立了链头,这样方便直接插入比l1头部还小的链,代码如下

    if (l1 == null) {
            return l2;
        }
        ListNode start = new ListNode(0);
        start.next = l1;
        ListNode before = start;
        while (l1 != null && l2 != null) {
            if (l1.val > l2.val) {
                ListNode temp = l2;
                l2 = l2.next;
                before.next = temp;
                temp.next = l1;
                before = temp;
            } else {
                before = l1;
                l1 = l1.next;
            }
        }
        if (l1 == null) {
            before.next = l2;
        }
        return start.next;
    复制代码

    时间复杂度: 该方案用了循环,循环层数为1,循环次数为l1或l2的最小长度,所以T(n)=O(n)

    空间复杂度: 该方案没有使用额外的空间,所以空间复杂度是O(1);

总结

本题的大致解法如上所诉,本题只想到了一种方法,直接按照思路来。

转载于:https://juejin.im/post/5cd90d2ae51d453a543f9e55

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值