合并链表

21 : 合并两个有序的链表

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(-1);  // 定义虚拟头节点
         ListNode cur = dummyHead;   // 定义跟着移动的指针
        while(l1!=null && l2 != null){   // 先看两个链表都不为空的时候
            if(l1.val < l2.val){
                cur.next = l1;   // 把较小的加入到cur节点的后面,并且移动l1到下一个节点
                l1 = l1.next;
            }else{
                cur.next = l2;
                l2 =l2.next;
            }
            cur = cur.next;   //在cur的后面加好了节点之后,要移动cur节点
        }
         if(l1 != null){      //如果l1还有剩余,则把l1接上去
             cur.next = l1;
         }
        else{		//注意这里一定是else。如果写  if(l2!=null) 会报错! 超出时间限制!
             cur.next = l2;
         }
        return dummyHead.next;   //最后返回虚拟头节点的下一个节点

leetcode 23 合并 k 个排序链表,返回合并后的排序链表。

采用分治的思想
在这里插入图片描述

class Solution {
    public ListNode mergeKLists(ListNode[] lists){
// 当 数组的长度等于0,1,2的时候:
        if(lists.length == 0){
            return null;
        }
        if(lists.length ==1){
            return lists[0];
        }
        if(lists.length == 2){
            return mergeTwoLists(lists[0],lists[1]);
        }
        // 定义两个数组,存放分开的子数组
        // 第一个数组的长度是 lists.length/2 , 第二个长度是lists.length - lists.length/2
        
        int mid = lists.length/2;
        ListNode[] lists1 = new ListNode[mid];
        ListNode[] lists2 = new ListNode[lists.length-mid];
        
        for(int i = 0 ; i < mid ;i++){
            lists1[i] = lists[i];
        }
        for(int i = 0 ; i < lists.length-mid ;i++){
             lists2[i] = lists[i+mid];
        }
        ListNode lt1 = mergeKLists(lists1);     // 递归,最后返回的是一个已经合并好的长链表
        ListNode lt2 = mergeKLists(lists2);   
        
        return mergeTwoLists(lt1,lt2);    // 再把最后两个合并好的 合并
    }
    //  合并两个链表的函数
    public ListNode mergeTwoLists(ListNode l1, ListNode l2){
        ListNode dummyHead = new ListNode(-1);
        ListNode cur = dummyHead;
        
        while(l1!=null && l2 != null){
            if(l1.val < l2.val){
                cur.next = l1;
                l1 = l1.next;
            }else{
                cur.next = l2;
                l2 =l2.next;
            }
            cur = cur.next;
        }
         if(l1 != null){
             cur.next = l1;
         }else{
             cur.next = l2;
         }
        return dummyHead.next;           
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值