链表oj----->合并k个有序链表

本文详细介绍了如何合并两个及多个有序链表,通过创建新的链表节点并比较当前链表节点值来实现合并。核心思想是使用迭代方式逐步合并,确保合并后的链表依然有序。解题代码中展示了如何实现合并两个链表以及如何扩展到合并k个链表的通用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目内容:

解题思路:

  • 合并k个有序链表的本质是首先可以合并两个有序有序链表
  • 如何合并两个有序链表:
  1. 新创建一个链表(为什么不能在原有的链表上进行更改,首先,链表长度不满足,其次,当更改一个其中的一个指向时,往后的结点已经丢失)
  2. 新创建的链表的指向只根据我们的要求去进行改变的
  3. 用这个方法合并时,必然会有一个链表至少有一个结点没有指向,所以,在循环结束后,需要对还没有指向空的链表继续进行连接
  4. 返回我们定义的链表就是合并后的新链表
  • 此时,合并k个升序链表就简单多了,我们只需用考虑,怎么才能让其连续合并,那就是利用循环,不断的更新我们定义的链表,就可以了

解题代码:

class Solution {
    //编写合并升序链表的方法
    public ListNode mergeTwoLists(ListNode l1,ListNode l2){
        //对两个头结点进行判断
        if(l1 == null){
            return l2;
        }
        if(l2 == null){
            return l1;
        }

        ListNode newNode = new ListNode(0);
        ListNode node = newNode;

        ListNode cur1 = l1;
        ListNode cur2 = l2;

        while(cur1 != null && cur2 != null){
            if(cur1.val < cur2.val){
                node.next = cur1;
                cur1 = cur1.next;
            }else{
                node.next = cur2;
                cur2 = cur2.next;
            }
            
            node = node.next;
        }

        if(cur1 == null){
            node.next = cur2;
        }
        if(cur2 == null){
            node.next = cur1;
        }

        return newNode.next;
    }
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists == null){
            return null;
        }

        ListNode node = null;
        for(int i = 0;i < lists.length;i++){
            node = mergeTwoLists(node,lists[i]);
        }
        return node;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值