LeetCode0023.合并K个升序链表 Go语言AC笔记

本文介绍了一种利用二分思想解决LeetCode中合并K个有序链表问题的方法。通过不断将链表数组二分并最终合并的方式,实现了高效的算法。时间复杂度为O(nlogn)。

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

时间复杂度:O(n logn)

解题思路

二分思想,转化为“21.合并两个有序链表”。

21题题解可以参考我之前写的

LeetCode0021.合并两个有序链表 Go语言AC笔记https://blog.youkuaiyun.com/Hexa_H/article/details/127278986该题要求合并K个,无非就是不断递归二分,直至数组里只有两个链表,这是对这两个链表进行合并,然后返回一个新链表。

最后返回的那个链表就是合并K个有序链表后的链表。

需要注意的是,如果链表数组没有元素,那么就返回一个空指针,如果有一个元素,那么就返回该链表。

AC代码

合并两个有序链表用的是迭代法,也可以写成递归的方式,代码更简略一些。

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeKLists(lists []*ListNode) *ListNode {
    if len(lists)==0{
        return nil
    }
    if len(lists)==1{
        return lists[0]
    }
    mid:=len(lists)>>1
    head1:=mergeKLists(lists[:mid])
    head2:=mergeKLists(lists[mid:])
    return merge2Lists(head1,head2)

}

func merge2Lists(head1,head2 *ListNode)*ListNode{
    res:=&ListNode{0,nil}
    p:=res
    for head1!=nil&&head2!=nil{
        if head1.Val<head2.Val{
            p.Next=head1
            head1=head1.Next
        }else{
            p.Next=head2
            head2=head2.Next
        }
        p=p.Next
    }
    if head1==nil{
        p.Next=head2
    }
    if head2==nil{
        p.Next=head1
    }
    return res.Next
}

感悟

昨晚21题又做的这道题,一开始想的是按顺序合并两个链表,看了题解才想到可以用“分而治之”的思想不断二分数组然后合并链表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwithunH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值