题目链接:86. 分隔链表

题解:

又是一道链表题,自己做又写成了死循环。。。

一定要画图去做!

题目简述:

给定一个无序链表,给定一个目标值,将小于目标值的节点放到大于等于目标值的左边!

题解:

很明显:要将链表一分为二,一部分放小于目标值,一部分放大于目标值。

具体思路:如下图

遇到小的放到一个链表,遇到大的放到另一个链表,最后将小的链表尾指向大的链表头,再将大的链表的末尾指向空即可!

注意:为了防止两个链表头找不到,一定要预先设置两个头lh, rh,并设置虚拟头结点,否则lt, rt后面的指向会乱,而且会构成死循环!(我好像就错到了这里)

时间复杂度O(n)

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
auto lh = new ListNode(-1), rh = new ListNode(-1);
auto lt = lh, rt = rh;

for(auto p = head; p; p = p->next){
if(p->val < x) lt = lt->next = p;
else rt = rt->next = p;
}
lt->next = rh->next;
rt->next = NULL;
return lh->next;
}
};