算法题---合并两个有序链表(乐乐独记)

1、题意描述

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


示例1:

在这里插入图片描述

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]


示例 2:

输入:l1 = [], l2 = []
输出:[]


示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

2、解题思路

做这道题的时候,我们应该想到以下几点:
1、由于我们操作的是链表,在合并的同时,我们是可以重复利用两个链表所占用的空间的,不需要额外开辟。
2、由于第一个节点我们就要开始比较,所以我们需要额外创建一个节点,最后将它剔除掉。

3、代码示例

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

    public static void main(String[] args) {
        ListNode list1 = new ListNode(1);
        ListNode list2 = new ListNode(1);
        list1.next = new ListNode(2);
        list1.next.next = new ListNode(4);
        list2.next = new ListNode(3);
        list2.next.next = new ListNode(4);
        MergeTwoLists mergeTwoLists = new MergeTwoLists();
        ListNode listNode = mergeTwoLists.mergeTwoLists(list1, list2);
        System.out.println(listNode);


    }

    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {

        if(null == list1){
            return list2;
        }

        if(null == list2){
            return list1;
        }

        // 1、定义一个头指针的前置指针
        ListNode preHead = new ListNode();
        ListNode preHeadTemp = preHead;

        // 然后遍历两个链表
        while (list1 != null && list2 != null){
            int val1 = list1.val;
            int val2 = list2.val;
            if(val1 <= val2){
                // 如果 val1 比较小,将val1链接上,然后将list1向下移动一位
                preHeadTemp.next = list1;
                list1 = list1.next;
            }else{
                // 如果 val2 比较小,将val2链接上,然后将list2向下移动一位
                preHeadTemp.next = list2;
                list2 = list2.next;
            }
            // 将最终返回的链表向下移动一位
            preHeadTemp = preHeadTemp.next;
        }

        // 将最后剩余的部分补上
        if(null != list1){
            preHeadTemp.next = list1;
        }

        if(null != list2){
            preHeadTemp.next = list2;
        }

        // 将最开始初始化的前置头指针去除掉
        return preHead.next;

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值