82原题地址
与之类似的还有86.分隔链表
86更简单一些:
比x小的都在大于等于x的节点之前,我是这样做:
定义三个指针:
q指向当前已经有序的链表里,小于x的最后一个;
cur记录当前有序链表的最后一个;
p用来遍历;
遍历p的时候,如果p大于等于x就不用处理,但小于又分两种:
1.头部大于等于x,需要换到头部前面;(只处理一次)
2.其他情况下,p只需要续到q后面;
正常的思路应该是:
cur->next=p->next;//后面的移除p
q->next=p;//前面的插入p;
p->next=q->next->next;
那么我假设这里的情况是 1 2 3 4 5,x是5
那么到p=3的时候 q=2;cur=2;
然后你就会发现:cur==p的前提下,2的下一步会成为p,原先的p->next会丢失。
所以cur==p的情况需要单独处理:
p,q,cur三个指针都顺移一位就可以了。
82比86复杂的点在于:
当A点与下一个点相等,往后顺延等于next即可,A点本身如何删去?
固然保留A前面的点是一种方法,
但我要判断A->next==A->next->next 保证他们非空的链条也太长了
所以说之前那种强行搬指针的路是很要命的
题解的思路才是正常刷题人的想法:
1.快慢指针;
2.虚拟头结点;
以86为例,分别做两个头结点,p指向head,q指向大于等于x的节点;
那么处理起来只需要:
创建两个新链表,小于x的(包括head)跟在p后面,大于x的放在q后面;(注意保持q->next=null)
然后p->next=q,返回p的头部就可以了;
网友评论