- 快慢指针找中值
- 从中值处分成两个链表
- 反转链表
- 合并链表
代码1:
代码 1 并不正确,原因在 mid 的确定,我们需要使反转的那个链表属于短的那一个,这样可以省去很多问题
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reorderList(head *ListNode) {
if head.Next == nil || head.Next.Next == nil {
return
}
a, b := head, head
var c *ListNode
for b != nil && b.Next != nil {
b = b.Next.Next
c = a
a = a.Next
}
c.Next = nil
a, b = head, rt(a)
var t,h *ListNode
for b != nil && a != nil {
t = a.Next
h = b.Next
a.Next = b
b.Next = t
a = t
b = h
}
return
}
func rt(b *ListNode) *ListNode {
var a, c *ListNode
for b != nil {
c = b.Next
b.Next = a
a = b
b = c
}
return a
}
代码2:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reorderList(head *ListNode) {
if head.Next == nil || head.Next.Next == nil {
return
}
a, b := head, head
for b != nil && b.Next != nil {
b = b.Next.Next
a = a.Next
}
mid := a.Next
a.Next = nil
a, b = head, rt(mid)
var t,h *ListNode
for b != nil && a != nil {
t = a.Next
h = b.Next
a.Next = b
b.Next = t
a = t
b = h
}
return
}
func rt(b *ListNode) *ListNode {
var a, c *ListNode
for b != nil {
c = b.Next
b.Next = a
a = b
b = c
}
return a
}