Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents
stylenone

Merge Two Sorted Lists 合并两个有序列表

https://leetcode.com/problems/merge-two-sorted-lists/

...

Code Block
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
    dummy := &ListNode{}
    p := dummy
    
    p1 := list1
    p2 := list2
    
    for p1 != nil && p2 != nil {
        if p1.Val < p2.Val {
            p.Next = p1
            p1 = p1.Next
            p = p.Next
        } else {
            p.Next = p2
            p2 = p2.Next
            p = p.Next
        }
    }
    
    if p1 != nil {
        p.Next = p1
    }
    
    if p2 != nil {
        p.Next = p2
    }
    
    return dummy.Next
}

Partition List 分隔链表

https://leetcode.com/problems/partition-list/

...

Code Block
languagego
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func partition(head *ListNode, x int) *ListNode {
    dummy1 := &ListNode{}
    dummy2 := &ListNode{}
    p1 := dummy1
    p2 := dummy2
    
    
    for p := head; p != nil; p = p.Next {
        if p.Val < x {
            p1.Next = p
            p1 = p1.Next
        } else {
            p2.Next = p
            p2 = p2.Next
        }
    }
    
    p1.Next = dummy2.Next
    p2.Next = nil
    
    return dummy1.Next
}

Merge k Sorted Lists 合并 k 个有序列表

https://leetcode.com/problems/merge-k-sorted-lists/

...

Code Block
languagego
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeKLists(lists []*ListNode) *ListNode {
    dummy := &ListNode{}
    p := dummy
    
    pq := &NodeHeap{}
    for _, l := range lists {
        if l != nil {
            heap.Push(pq, l)
        }
    }
    
    for pq.Len() != 0 {
        v := heap.Pop(pq).(*ListNode)
        p.Next = v
        p = p.Next
        
        if v.Next != nil {
            heap.Push(pq, v.Next)
        }
    }
    
    return dummy.Next
}

type NodeHeap []*ListNode

func (h NodeHeap) Len() int {
    return len(h)
}
func (h NodeHeap) Swap(i, j int) {
    h[i], h[j] = h[j], h[i]
}
func (h NodeHeap) Less(i, j int) bool {
    return h[i].Val < h[j].Val
}

func (h *NodeHeap) Push(x any) {
    *h = append(*h, x.(*ListNode))
}
func (h *NodeHeap) Pop() any {
    n := len(*h)
    
    v := (*h)[n-1]
    *h = (*h)[:n-1]
    
    return v
}

Remove Nth Node From End of List 删除链表的倒数第 N 个结点

https://leetcode.com/problems/remove-nth-node-from-end-of-list/

...

Code Block
languagego
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeNthFromEnd(head *ListNode, n int) *ListNode {
    dummy := &ListNode{Next: head}
    
    prev := findFromEnd(dummy, n+1)
    prev.Next = prev.Next.Next
    
    return dummy.Next
}

func findFromEnd(head *ListNode, n int) *ListNode {
    p1 := head
    
    p2 := head
    for i := 0; i < n; i++ {
        p2 = p2.Next
    }
    
    for p2 != nil {
        p2 = p2.Next
        p1 = p1.Next
    }
    
    return p1
}

Middle of the Linked List 链表的中间结点(找到链表的中点)

https://leetcode.com/problems/middle-of-the-linked-list/

...

  • 原链为奇数 [0, 2p+1) → 新链为偶数 [0, 2p+2) → 取中点获得新链的 p+1 号节点 → 等同原链的 p 号节点

  • 原链为偶数 [0, 2p) → 新链为奇数 [0, 2p+1) → 取中点获得新链的 p 号节点 → 等同原链的 p-1 号节点

Delete the Middle Node of a Linked List 删除链表的中间节点

https://leetcode.com/problems/delete-the-middle-node-of-a-linked-list/

...

https://singee.atlassian.net/wiki/spaces/algorithm/pages/edit-v2/49316106#Middle-of-the-Linked-List 的基础上,记录 slow 前面那个指针

Linked List Cycle 环形链表(判断链表是否有环)

https://leetcode.com/problems/linked-list-cycle/

Code Block
languagego
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
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
}

Linked List Cycle II 环形链表 II (找到环形链表的起点)

https://leetcode.com/problems/linked-list-cycle-ii/

...

解法说明:快慢指针相遇时,让其中一个指针指回起点,再重新同速行进再次遇到则为环起点

Intersection of Two Linked Lists 相交链表(判断两个链表是否相交)

https://leetcode.com/problems/intersection-of-two-linked-lists/description/

...