Table of Contents | ||
---|---|---|
|
LC 21. 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 } |
LC 86. Partition List 分隔链表
https://leetcode.com/problems/partition-list/
...
Code Block | ||
---|---|---|
| ||
/** * 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 } |
LC 23. Merge k Sorted Lists 合并 k 个有序列表
https://leetcode.com/problems/merge-k-sorted-lists/
...
Code Block | ||
---|---|---|
| ||
/** * 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 } |
LC 19. Remove Nth Node From End of List 删除链表的倒数第 N 个结点
https://leetcode.com/problems/remove-nth-node-from-end-of-list/
...
Code Block | ||
---|---|---|
| ||
/** * 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 } |
LC 876. 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 号节点
LC 2095. Delete the Middle Node of a Linked List 删除链表的中间节点
https://leetcode.com/problems/delete-the-middle-node-of-a-linked-list/
Code Block | ||
---|---|---|
| ||
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func deleteMiddle(head *ListNode) *ListNode { slow := head fast := head prev := (*ListNode)(nil) for fast != nil && fast.Next != nil { prev = slow slow = slow.Next fast = fast.Next.Next } if prev == nil { // only one node return nil } prev.Next = prev.Next.Next return head } |
在 https://singee.atlassian.net/wiki/spaces/algorithm/pages/edit-v2/49316106#Middle-of-the-Linked-List 的基础上,记录 slow 前面那个指针
LC 141. Linked List Cycle 环形链表(判断链表是否有环)
https://leetcode.com/problems/linked-list-cycle/
Code Block | ||
---|---|---|
| ||
/** * 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 } |
LC 142. Linked List Cycle II 环形链表 II (找到环形链表的起点)
https://leetcode.com/problems/linked-list-cycle-ii/
...
解法说明:快慢指针相遇时,让其中一个指针指回起点,再重新同速行进再次遇到则为环起点
LC 160. Intersection of Two Linked Lists 相交链表(判断两个链表是否相交)
https://leetcode.com/problems/intersection-of-two-linked-lists/description/
...
解法 4:将 tail.Next 与 headB 相连,即成一个「链+圈」结构,用 https://singee.atlassian.net/wiki/spaces/algorithm/pages/edit-v2/49316106#Linked-List-Cycle-II-%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8-II-%EF%BC%88%E6%89%BE%E5%88%B0%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8%E7%9A%84%E8%B5%B7%E7%82%B9%EF%BC%89 算法即可解决