143.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package main
  2. /**
  3. * Definition for singly-linked list.
  4. * type ListNode struct {
  5. * Val int
  6. * Next *ListNode
  7. * }
  8. */
  9. func reorderListOld(head *ListNode) {
  10. // Given a singly linked list L: L0→L1→…→Ln-1→Ln,
  11. // reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
  12. if head == nil || head.Next == nil {
  13. return
  14. }
  15. stack := make([]*ListNode, 0)
  16. beg := head
  17. length := 0
  18. for beg != nil {
  19. stack = append(stack, beg)
  20. beg = beg.Next
  21. length++
  22. }
  23. beg = head
  24. for i := 0; i < length/2; i++ {
  25. tmp := beg.Next
  26. beg.Next = stack[length-i-1]
  27. beg.Next.Next = tmp
  28. beg = tmp
  29. }
  30. beg.Next = nil
  31. }
  32. func reorderList(head *ListNode) {
  33. if head == nil || head.Next == nil {
  34. return
  35. }
  36. slow, fast := head, head
  37. for fast != nil && fast.Next != nil {
  38. // Find the middle of list
  39. slow = slow.Next
  40. fast = fast.Next.Next
  41. }
  42. // Reverse the 2nd part
  43. var prev *ListNode
  44. for slow.Next != nil {
  45. tmp := slow.Next
  46. slow.Next = prev
  47. prev = slow
  48. slow = tmp
  49. }
  50. slow.Next = prev
  51. // Merge the 1st part and the 2nd part
  52. left, right := head, slow
  53. for left != nil && right.Next != nil {
  54. tmpL, tmpR := left.Next, right.Next
  55. left.Next = right
  56. right.Next = tmpL
  57. left, right = tmpL, tmpR
  58. }
  59. }
  60. // func main() {
  61. // n5 := ListNode{5, nil}
  62. // n4 := ListNode{4, &n5}
  63. // // n4 := ListNode{4, nil}
  64. // n3 := ListNode{3, &n4}
  65. // n2 := ListNode{2, &n3}
  66. // n1 := ListNode{1, &n2}
  67. // printList(&n1)
  68. // reorderList(&n1)
  69. // printList(&n1)
  70. // }