greyireland / algorithm-pattern

算法模板,最科学的刷题方式,最快速的刷题路径,你值得拥有~
MIT License
15.21k stars 2.58k forks source link

关于中点问题 #25

Open voidbytes opened 4 years ago

voidbytes commented 4 years ago

https://github.com/greyireland/algorithm-pattern/blob/master/data_structure/linked_list.md 里面说"fast 如果初始化为 head.Next 则中点在 slow.Next

如果链表长度是偶数,返回中间偏右的位置 且fast如果初始化为head->next 返回中间偏左的位置。

但是对于奇数长度两者中点相同吧

  1. 链表的中间结点:https://leetcode-cn.com/problems/middle-of-the-linked-list/
greyireland commented 4 years ago

实现了一下:https://leetcode-cn.com/problems/middle-of-the-linked-list/

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func middleNode(head *ListNode) *ListNode {
    // v1
    // 1->2->3->4->5->nil
    // 1->2->3->4->5->6->nil
    if head==nil{
        return nil
    }
    fast := head
    slow := head
    for fast != nil && fast.Next != nil {
        fast = fast.Next.Next
        slow = slow.Next
    }
    return slow
}
func middleNode2(head *ListNode) *ListNode {
    // v2分为两种情况:
    // 1->2->3->4->5->nil
    // 1->2->3->4->5->6->nil
    if head==nil{
        return nil
    }
    fast := head.Next
    slow := head
    for fast != nil && fast.Next != nil {
        fast = fast.Next.Next
        slow = slow.Next
    }
    if fast==nil{
        return slow
    }
    return slow.Next
}

这个题只是要求找中点,所以v1可能更简单一点,但如果要从中间分开这个链表,需要找到链表中点的前一个节点,v1就没法找到了 可以试试这两个题:

https://leetcode-cn.com/problems/sort-list/

https://leetcode-cn.com/problems/reorder-list/