0
点赞
收藏
分享

微信扫一扫

LeetCode 打卡 Day 19 — 合并K个升序链表

海牙秋天 2022-03-11 阅读 73

1、题目

2、题解

1)看到题的第一反应是暴力求解,即将数组内的各个链表直接相连在一起,然后再对整体链表进行排序,但这样做就浪费了数组内单个链表已经升序排列的这一特点。所以想了个稍微复杂点的方法,那就是依次遍历,将第二个链表插入第一个构建新链表,再将第三个插入新链表,依次类推。总感觉应该还有更简单的办法,但先把这个方法实现看看吧。代码如下:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeKLists(lists []*ListNode) *ListNode {
    var res *ListNode

    if len(lists) == 0{
        return res
    }
    if len(lists) == 1{
        return lists[0]
    }
    for _, list := range lists{
        res = orderList(res, list)
    }
    return res
}

func orderList(l1, l2 *ListNode) (r *ListNode) {
    var m, s *ListNode

    if l1 == nil{
        r = l2
        return
    }
    if l2 == nil{
        r = l1
        return
    }
    if l1.Val<=l2.Val{
        m = l1
        s = l2
    }else{
        m = l2
        s = l1
    }
    r = m
    for ; s!=nil; {
        tmp1 := m
        for ;s.Val>=m.Val; {
            if m.Next == nil {
                m.Next = s
                return 
            }
            tmp1 = m
            m = m.Next
        }
        // s插入m之前的位置
        // fmt.Println(strconv.Itoa(tmp1.Val)+" "+strconv.Itoa(s.Val)+""+strconv.Itoa(m.Val))
        tmp2 := s.Next
        tmp1.Next = s
        s.Next = m
        m = s
        s = tmp2
    }
    return
}

提交结果

 

2)时间晚了,不想学了,后续想要看看题解有没有简便方法 

举报

相关推荐

0 条评论