技巧汇总
- 快慢指针
- 先找到中间节点
- 如果要调用next..确保当前节点不为空。 依次类推。.next不为空
- 是否有环。走过的路。重新走。互相走。
- 画图,分解,
- 暴力法。用hashset
- 插入法翻转。
| package main |
| |
| import ( |
| "fmt" |
| |
| . "github.com/isdamir/gotype" |
| ) |
| |
| func AddLNode(h1, h2 *LNode) *LNode { |
| |
| |
| if h1 == nil || h1.Next == nil { |
| return h2 |
| } |
| |
| if h2 == nil || h2.Next == nil { |
| return h1 |
| } |
| |
| c := 0 |
| sum := 0 |
| p1 := h1.Next |
| p2 := h2.Next |
| resultHead := &LNode{} |
| |
| p := resultHead |
| |
| for p1 != nil || p2 != nil { |
| var p1_int int |
| var p2_int int |
| if p1 == nil { |
| p1_int = 0 |
| } else { |
| p1_int = p1.Data.(int) |
| } |
| if p2 == nil { |
| p2_int = 0 |
| } else { |
| p2_int = p2.Data.(int) |
| } |
| p.Next = &LNode{} |
| sum = p1_int + p2_int + c |
| |
| p.Next.Data = sum % 10 |
| c = sum / 10 |
| p = p.Next |
| if p1 != nil { |
| p1 = p1.Next |
| } |
| if p2 != nil { |
| p2 = p2.Next |
| } |
| |
| } |
| |
| if c == 1 { |
| p.Next = &LNode{Data: 1} |
| } |
| |
| return resultHead |
| |
| } |
| |
| |
| |
| |
| |
| |
| |
| func findMiddleNode(head *LNode) *LNode { |
| if head == nil || head.Next == nil { |
| return head |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| fast := head |
| slow := head |
| slowPre := head |
| for fast != nil && fast.Next != nil { |
| slowPre = slow |
| slow = slow.Next |
| fast = fast.Next.Next |
| } |
| slowPre.Next = nil |
| return slow |
| } |
| |
| |
| func reversLNode(head *LNode) *LNode { |
| |
| |
| if head == nil || head.Next == nil { |
| return head |
| } |
| var cur *LNode |
| var curnext *LNode |
| cur = head.Next.Next |
| |
| head.Next.Next = nil |
| |
| for cur != nil { |
| |
| |
| curnext = cur.Next |
| |
| |
| cur.Next = head.Next |
| head.Next = cur |
| |
| cur = curnext |
| |
| |
| |
| |
| |
| } |
| return head |
| } |
| |
| |
| |
| func ReorderLNode(head *LNode) { |
| if head == nil || head.Next == nil { |
| return |
| } |
| |
| cur1 := head |
| mid := findMiddleNode(head.Next) |
| head2 := &LNode{} |
| head2.Next = mid |
| cur2 := reversLNode(head2) |
| |
| |
| PrintNode("cur1:", cur1) |
| PrintNode("cur2:", cur2) |
| |
| cur1 = cur1.Next |
| cur2 = cur2.Next |
| |
| for cur1.Next != nil { |
| |
| |
| |
| |
| cur1_tmp := cur1.Next |
| cur1.Next = cur2 |
| cur1 = cur1_tmp |
| cur2_tmp := cur2.Next |
| cur2.Next = cur1 |
| cur2 = cur2_tmp |
| |
| } |
| |
| |
| |
| cur1.Next = cur2 |
| |
| } |
| |
| |
| |
| |
| |
| func FindLastK1(head *LNode, k int) *LNode { |
| |
| if head == nil || head.Next == nil { |
| return head |
| } |
| |
| return head |
| |
| } |
| |
| |
| |
| |
| func FindLastK2(head *LNode, k int) *LNode { |
| |
| if head == nil || head.Next == nil { |
| return head |
| } |
| |
| fast := head.Next |
| slow := head.Next |
| |
| i := 0 |
| for i = 0; i < k && fast != nil; i++ { |
| fast = fast.Next |
| } |
| |
| if i < k { |
| |
| return nil |
| } |
| |
| for fast != nil { |
| slow = slow.Next |
| fast = fast.Next |
| } |
| |
| return slow |
| |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| func isLoop(head *LNode) *LNode { |
| |
| if head == nil || head.Next == nil { |
| return head |
| } |
| |
| slow := head.Next |
| fast := head.Next |
| |
| for fast != nil && fast.Next != nil { |
| slow = slow.Next |
| fast = fast.Next.Next |
| if slow == fast { |
| return slow |
| } |
| } |
| |
| return nil |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| func FindLoopNode(head *LNode, meetNode *LNode) *LNode { |
| first := head.Next |
| second := meetNode |
| for first != second { |
| first = first.Next |
| second = second.Next |
| } |
| return first |
| |
| } |
| |
| |
| |
| func ReverseK(head *LNode, k int) { |
| if head == nil || head.Next == nil { |
| return |
| } |
| |
| pre := head |
| begin := head.Next |
| var end *LNode |
| |
| var pNext *LNode |
| |
| for begin != nil { |
| end = begin |
| for i := 1; i < k; i++ { |
| |
| if end.Next != nil { |
| end = end.Next |
| } else { |
| break |
| } |
| } |
| pNext = end.Next |
| end.Next = nil |
| myhead := &LNode{} |
| myhead.Next = begin |
| pre.Next = reversLNode(myhead).Next |
| begin.Next = pNext |
| |
| pre = begin |
| begin = pNext |
| } |
| |
| } |
| |
| |
| |
| func MergeLNode(h1 *LNode, h2 *LNode) *LNode { |
| |
| if h1 == nil || h1.Next == nil { |
| return h2 |
| } |
| |
| if h2 == nil || h2.Next == nil { |
| return h1 |
| } |
| p1 := h1.Next |
| p2 := h2.Next |
| r := &LNode{} |
| pre := r |
| for p1 != nil && p2 != nil { |
| if p1.Data.(int) < p2.Data.(int) { |
| pre.Next = p1 |
| |
| pre = p1 |
| p1 = p1.Next |
| } else { |
| pre.Next = p2 |
| pre = p2 |
| p2 = p2.Next |
| } |
| } |
| |
| if p1 != nil { |
| pre.Next = p1 |
| } |
| |
| if p2 != nil { |
| pre.Next = p2 |
| } |
| return r |
| } |
| |
| |
| |
| |
| |
| |
| func RemoveNode(deleteNode *LNode) bool { |
| if deleteNode == nil || deleteNode.Next == nil { |
| return false |
| } |
| |
| deleteNode.Data = deleteNode.Next.Data |
| deleteNode.Next = deleteNode.Next.Next |
| return true |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| func IsIntersect(head1 *LNode, head2 *LNode) *LNode { |
| if head1 == nil || head1.Next == nil || head2 == nil || head2.Next == nil { |
| return nil |
| } |
| |
| cur1 := head1.Next |
| cur2 := head2.Next |
| |
| for cur1 != nil && cur2 != nil { |
| cur1 = cur1.Next |
| cur2 = cur2.Next |
| if cur1 == cur2 { |
| return cur1 |
| } |
| } |
| |
| if cur1 == nil { |
| cur1 = head2.Next |
| for cur1 != nil && cur2 != nil { |
| cur1 = cur1.Next |
| cur2 = cur2.Next |
| if cur1 == cur2 { |
| return cur1 |
| } |
| } |
| if cur2 == nil { |
| cur2 = head1.Next |
| } |
| for cur1 != nil && cur2 != nil { |
| cur1 = cur1.Next |
| cur2 = cur2.Next |
| if cur1 == cur2 { |
| return cur1 |
| } |
| } |
| } |
| if cur2 == nil { |
| cur2 = head1.Next |
| for cur1 != nil && cur2 != nil { |
| cur1 = cur1.Next |
| cur2 = cur2.Next |
| if cur1 == cur2 { |
| return cur1 |
| } |
| } |
| |
| if cur1 == nil { |
| cur1 = head2.Next |
| } |
| for cur1 != nil && cur2 != nil { |
| cur1 = cur1.Next |
| cur2 = cur2.Next |
| if cur1 == cur2 { |
| return cur1 |
| } |
| } |
| |
| } |
| return nil |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| type LDNode struct { |
| data int |
| right *LDNode |
| down *LDNode |
| } |
| |
| func (p *LDNode) Insert(headRef *LDNode, data int) *LDNode { |
| newNode := &LDNode{data: data, down: headRef} |
| headRef = newNode |
| return headRef |
| } |
| |
| func MergeLDNode(h1 *LDNode, h2 *LDNode) *LDNode { |
| |
| if h1 == nil { |
| return h2 |
| } |
| if h2 == nil { |
| return h1 |
| } |
| |
| var r *LDNode |
| if h1.data < h2.data { |
| r = h1 |
| r.down = MergeLDNode(h1.down, h2) |
| } else { |
| r = h2 |
| r.down = MergeLDNode(h1, h2.down) |
| } |
| return r |
| } |
| func main() { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| fmt.Println("fuck ") |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| l1 := &LNode{} |
| CreateNode(l1, 9) |
| l2 := &LNode{} |
| CreateNode(l2, 4) |
| PrintNode("L1:", l1) |
| PrintNode("L2:", l2) |
| l2.Next = l1.Next.Next |
| l2.Next.Next.Next = l1.Next.Next.Next.Next |
| PrintNode("L1:", l1) |
| PrintNode("L2:", l2) |
| |
| r := IsIntersect(l1, l2) |
| if r != nil { |
| fmt.Println("intersect:", r.Data) |
| } |
| } |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统