【刷leetcode】15.合并两个排序的链表

题目描述

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

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

限制:
0 <= 链表长度 <= 1000

思路

遍历两个链表,比较它们正在指向的元素大小。谁小就添加到新链表中。如果一个链表遍历完了,而另一个链表还没有,就把剩余部分全部添加到新链表中。

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //1.新建一个链表,用于存放结果。先给它设置一个头节点,再给它设置一个指针,用来添加节点
        ListNode head = new ListNode(0);
        ListNode cur = head; //指针初始指向头节点

        //2.分别遍历两个链表,比较两个链表的指针指向的元素大小
        while((l1 != null) && (l2 != null)){
            //2.1哪个小,就把哪个添加到新链表中
            if(l1.val <= l2.val){
                cur.next = l1;
                l1 = l1.next;
            }
            else{
                cur.next = l2;
                l2 = l2.next;
            }
            //2.2新链表多了一个新节点啦,cur也要指向新节点哦
            cur = cur.next;
        }

        //3.循环结束了,要么两个链表都遍历完了,要么还剩一个链表没遍历完。
        //把剩余的部分加到新链表
        if(l1 != null){
            cur.next = l1;
        }
        if(l2 != null){
            cur.next = l2;
        }

        //4.返回新链表。新链表的头节点是我们自己设置的。返回头节点的下一个节点就好啦
        return head.next;
    }
}

复杂度分析

时间复杂度:O(m+n) 需要遍历两个链表。m和n分别是两个排序链表的长度
空间复杂度:O(1) 额外的节点head和cur。使用了常数大小的额外空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值