合并 K个有序列表, 递归解法

合并k个已排序的链表

http://www.nowcoder.com/questionTerminal/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

//递归解法比较直接好想,不过递归会使用栈空间O(logk)

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 
 * @param lists ListNode类一维数组 
 * @return ListNode类
*/
//合并两个有序列表O(n)
func merge(a, b *ListNode ) *ListNode {
    var L ListNode
    var p *ListNode = &L

    for a != nil && b != nil {
        if a.Val <= b.Val {
            p.Next = a
            p = a;
            a = a.Next
            p.Next = nil
        }else {
            p.Next = b;
            p = b;
            b = b.Next;
            p.Next = nil;
        }
    }
    if a != nil {
        p.Next = a;
    }else {
        p.Next = b;
    }

    return L.Next;
}
//递归,利用归并排序思想
func M(lists []*ListNode, L, R int) *ListNode {
    if L > R {
        return nil;
    }
    if L == R {
        return lists[L];
    }
    mid := (L+R)/2;
    L1 := M(lists, L, mid);
    L2 := M(lists, mid+1, R);
    return merge(L1, L2);
}
func mergeKLists( lists []*ListNode ) *ListNode {
    return M(lists, 0, len(lists)-1)
}
全部评论

相关推荐

frutiger:逆天,我家就安阳的,这hr咋能说3k的,你送外卖不比这工资高得多?还说大厂来的6k,打发叫花子的呢?这hr是怎么做到说昧良心的话的
点赞 评论 收藏
分享
05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务