题目描述
牛客链接:
https://www.nowcoder.com/practice/3d281dc0b3704347846a110bf561ef6b?tpId=117&&tqId=34923&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
解题思路:
提供两种思路,第一种用辅助栈
第二种直接原地算法
代码一:
用辅助栈
package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
*
* @param head ListNode类
* @return void
*/
func reorderList( head *ListNode ) {
// write code here
if head == nil || head.Next==nil {
return
}
var stk []*ListNode
temp := head
for temp != nil {
stk = append(stk, temp)
temp = temp.Next
}
count := len(stk)
begin := head
tail := stk[count-1]
for begin != tail {
temp = begin.Next
begin.Next = tail
tail.Next = temp
if temp == tail {
temp.Next = nil
break
}
begin = temp
count = count - 1
tail = stk[count]
}
if begin==tail {
temp.Next = nil
}
return
}
代码二:
原地算法
package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
*
* @param head ListNode类
* @return void
*/
func reorderList( head *ListNode ) {
// write code here
if head == nil || head.Next==nil {
return
}
//通过快慢指针找到中间结点
fast := head
slow := head
for fast!=nil && fast.Next!=nil {
fast = fast.Next.Next
slow = slow.Next
}
//将后面的链表进行反转
temp := slow
var pre *ListNode = nil
for temp != nil {
temp1 := temp.Next
temp.Next = pre
pre = temp
temp = temp1
}
//将前后两个链表合成一个
fast = head
for fast!=pre && pre!=nil {
temp1 := fast.Next
fast.Next = pre
temp2 := pre.Next
pre.Next = temp1
temp = pre //记录合成链表的最后一个指针
fast = temp1
pre = temp2
}
if pre!=nil {
temp.Next = pre
pre.Next = nil
} else {
temp.Next = nil
}
return
}
注意:
快慢指针
链表翻转
辅助栈
链表最后指针记录