程序员面试金典02.04 分割链表-中等
题目:
给你一个链表的头节点 head 和一个特定值 x,请你对链表进行分割,使得所有小于 x 的节点都出现在 大于或等于 x 的节点之前。
你不需要保留每个分区中各节点的初始相对位置。
解题思路
利用两个哑结点 left 和 right,遍历整个链表,其中 left 保存小于 x 的节点,right 保存大于或等于x的节点。
遍历结束,将两个链表在拼接起来。
注意,拼接前把 right 尾部置空。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
// date 2023/10/09
func partition(head *ListNode, x int) *ListNode {
if head == nil || head.Next == nil {
return head
}
left, right := &ListNode{}, &ListNode{}
p1, p2 := left, right
for head != nil {
if head.Val < x {
p1.Next = head
p1 = head
} else {
p2.Next = head
p2 = head
}
head = head.Next
}
// 将 right 尾部封住
if p2 != nil {
p2.Next = nil
}
p1.Next = right.Next
return left.Next
}
最后更新于