...
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
} |
Merge k Sorted Lists
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
} |
Remove Nth Node From End of List
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 {
p1 := head
p2 := head
for i := 0; i < n; i++ {
p2 = p2.Next
}
prev := (*ListNode)(nil)
for p2 != nil {
p2 = p2.Next
prev = p1
p1 = p1.Next
}
if prev == nil {
return head.Next
}
prev.Next = prev.Next.Next
return head
} |
本题重点在于利用双指针找到倒数第 x 个节点
将找到倒数第 x 个节点封装成函数 findFromEnd
,题目可以转变为 找到倒数第 n+1 个节点 然后进行操作
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
} |