【LeetCode 力扣 剑指Offer 25】 合并两个排序的链表,输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

学习目标:

目标:熟练运用Java所学知识


学习内容:

本文内容:使用Java实现:合并两个排序的链表


题目描述:

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

示例1:

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

解题思路:

将两个排序的链表合并成一个新的排序的链表,由于原链表是有序的,所以我们只需要按顺序遍历,比较两个链表每个数据的大小进行排序,放入新的链表,当连个数据相同时,随意放入一个数值即可

  • 首先创建保存新的排序链表的新链表
        ListNode cur1=l1;//用于遍历l1链表
        ListNode cur2=l2;//用于遍历l2链表
        ListNode newHead=new ListNode(0);//创建带傀儡的新链表,用于存放新的排序链表
        ListNode newTail=newHead;//记录尾结点位置
  • 排除某一个链表为空的情况
 //判断两个链表是否都是空链表
       if(cur1==null&&cur2==null){
    
    
           return null;
       }
       //如果cur1为空,则返回l2链表
       if(cur1==null){
    
    
           return l2;
       }
       //如果cur2为空,则返回l1链表
       if(cur2==null){
    
    
           return l1;
       }
  • 比较两个链表数据的大小
   while(cur1!=null&&cur2!=null){
    
    
            //链表1的数据小于链表2的数据
            if(cur1.val<cur2.val){
    
    
                newTail.next=cur1;//将较小数据存放到新链表
                cur1=cur1.next;//更新链表位置
            }
            //链表1的数据大于等于链表2的数据
            else{
    
    
                newTail.next=cur2;//将较小数据存放到新链表
                cur2=cur2.next;//更新链表位置
            }
            newTail=newTail.next;
        }
  • 遍历结束之后,判断是否有某一个链表没有遍历完
     //遍历结束之后,判断是否有某一个链表没有遍历完
        if(cur1==null){
    
    
            newTail.next=cur2;
        }else{
    
    
            newTail.next=cur1;
        }

实现代码

 public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    
    
        ListNode cur1=l1;
        ListNode cur2=l2;
        ListNode newHead=new ListNode(0);//创建带傀儡的新链表,用于存放新的排序链表
        ListNode newTail=newHead;//记录尾结点位置
        //判断两个链表是否都是空链表
        if(cur1==null&&cur2==null){
    
    
            return null;
        }
        //如果cur1为空,则返回l2链表
        if(cur1==null){
    
    
            return l2;
        }
        //如果cur2为空,则返回l1链表
        if(cur2==null){
    
    
            return l1;
        }
        //比较两个链表数据的大小
        while(cur1!=null&&cur2!=null){
    
    
            //链表1的数据小于链表2的数据
            if(cur1.val<cur2.val){
    
    
                newTail.next=cur1;//将较小数据存放到新链表
                cur1=cur1.next;//更新链表位置
            }
            //链表1的数据大于等于链表2的数据
            else{
    
    
                newTail.next=cur2;//将较小数据存放到新链表
                cur2=cur2.next;//更新链表位置
            }
            newTail=newTail.next;
        }
        //遍历结束之后,判断是否有某一个链表没有遍历完
        if(cur1==null){
    
    
            newTail.next=cur2;
        }else{
    
    
            newTail.next=cur1;
        }
        return newHead.next;
    }

猜你喜欢

转载自blog.csdn.net/zhangxxin/article/details/114500337
今日推荐