【面试必刷TOP101】合并k个已排序的链表 & 判断链表中是否有环

目录

题目:合并k个已排序的链表_牛客题霸_牛客网 (nowcoder.com)

题目的接口:

解题思路:

代码:

过啦!!!

题目:判断链表中是否有环_牛客题霸_牛客网 (nowcoder.com)

题目的接口:

解题思路:

代码:

过啦!!!

扫描二维码关注公众号,回复: 16755812 查看本文章

写在最后:


题目:合并k个已排序的链表_牛客题霸_牛客网 (nowcoder.com)

题目的接口:

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

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param lists ListNode类一维数组 
 * @return ListNode类
*/
func mergeKLists( lists []*ListNode ) *ListNode {
    // write code here
}

解题思路:

这道题合并链表的部分和昨天的一模一样,直接实现一个合并的方法调用就好了,这道题目的核心思想是分治思想,利用分治思想将所有链表合并,具体操作如下:

1)当链表数量 == 0 时,证明没有链表需要合并,返回 nil

2)当链表数量 == 1 时,证明只剩一个链表了,直接返回唯一的这一条链表

3)当链表数量 == 2 时,证明只剩下两条链表了,返回这两个链表的合并

4)当链表数量 > 2 时,我们就利用分治的思想,把这些链表对半分开计算,一直递归分治,直到链表的数量 <= 2,这样就可以走我们上面三条逻辑完成每一个部分的链表合并。代码如下:

代码:

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

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param lists ListNode类一维数组 
 * @return ListNode类
*/
func mergeKLists( lists []*ListNode ) *ListNode {
    n := len(lists)

    if n == 0 {
        return nil
    }
    if n == 1 {
        return lists[0]
    }
    if n == 2 {
        return merge(lists[0], lists[1])
    } 

    tmp := n / 2
    return merge(mergeKLists(lists[:tmp]), mergeKLists(lists[tmp:]))
    
}

func merge(list1 *ListNode, list2 *ListNode) *ListNode {
    if list1 == nil && list2 == nil {
        return nil
    }

    head := &ListNode{}
    cur := head
    for list1 != nil && list2 != nil {
        if list1.Val < list2.Val {
            cur.Next = list1
            list1 = list1.Next
        } else {
            cur.Next = list2
            list2 = list2.Next
        }
        cur = cur.Next
    }

    if list1 != nil {
        cur.Next = list1
    }

    if list2 != nil {
        cur.Next = list2
    }

    return head.Next
}

过啦!!!

题目:判断链表中是否有环_牛客题霸_牛客网 (nowcoder.com)

题目的接口:

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

/**
 * 
 * @param head ListNode类 
 * @return bool布尔型
*/
func hasCycle( head *ListNode ) bool {
    // write code here
}

解题思路:

这道题非常非常的经典,我也做过很多很多遍了,我到现在还记得我第一次做这道题的时候的思路,我当时的思路是直接强行遍历,如果遍历到 nil 就证明这个链表没有环,如果一直无限循环超出了题目给了用例长度,那就证明没有环,你别说,之前还过了

当然,我现在写这道题就是用标准的快慢指针的写法,slow 指针一次走一步,fast 指针一次走两步,他们如果链表有环,那他们迟早会相遇。代码如下:

代码:

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

/**
 * 
 * @param head ListNode类 
 * @return bool布尔型
*/
func hasCycle( head *ListNode ) bool {
    slow := head
    fast := head
    for fast != nil && fast.Next != nil {
        slow = slow.Next
        fast = fast.Next.Next
        if slow == fast {
            return true
        }
    }
    return false
}

过啦!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

猜你喜欢

转载自blog.csdn.net/Locky136/article/details/132854053