leetcode86 分隔链表
解法:
借助两个指针
可认为链表左边有序,右边无序
找到左边有序的最后一个位置pre
用cur去找到小于x的节点的前一个位置
时间复杂度O(n)空间复杂度O(1)
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if(head==NULL||head->next==NULL) return head;
ListNode* pre;
ListNode* cur;
ListNode* dummy=new ListNode(x-1);
dummy->next=head;
pre=dummy;
while(pre->next!=NULL&&pre->next->val<x)
{
pre=pre->next;
}
if(pre->next==NULL) return head;
cur=pre->next;
while(cur->next!=NULL)
{
if(cur->next->val<x)
{
ListNode* point=cur->next;
cur->next=cur->next->next;
point->next=pre->next;
pre->next=point;
pre=pre->next;
}
else{
cur=cur->next;
}
}
return dummy->next;
}
};
参考解法:
用两个额外的链表分别存储小于x的、大于等于x的元素
空间复杂度会高一点
注意点:
def partition(self, head: ListNode, x: int) -> ListNode:
l1=ListNode(0)
l2=ListNode(0)
before=l1
after=l2
p=head
while p:
if p.val<x:
before.next=p
before=before.next
else:
after.next=p
after=after.next
p=p.next
after.next=None##这里不给l2加上None 就不会结束
before.next=l2.next
return l1.next