[抄题]:
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given 1->4->3->2->5->2
and x = 3,
return 1->2->2->4->3->5
.
[思维问题]:
不知道怎么找链表最后一个元素,以为要循环。
其实可以利用“指针节点”的思想,一直添加,最后自然就是最后一个了。
[一句话思路]:
高个节点链表和矮子节点链表拼起来即可。
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- 要写corner case,还是要返回head
- 直接连接到右边head,因为右边的dummy不需要。
- 注意最后返回的是leftDummy.next
[总结]:
不需要像数组一样用logn空间的partition,直接左右添加就行
[复杂度]:Time complexity: O(n) Space complexity: O(1) 不需要额外空间,就都是1
[英文数据结构,为什么不用别的数据结构]:
[其他解法]:
[Follow Up]:
[题目变变变]:
2/3/4 colors
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode partition(ListNode head, int x) { if (head == null) { return head; } ListNode leftDummy = new ListNode(0); ListNode rightDummy = new ListNode(0); ListNode left = leftDummy; ListNode right = rightDummy; //two linked list while(head != null) { if (head.val < x) { left.next = head; left = left.next; } else { right.next = head; right = right.next; } head = head.next; } //join up right.next = null; left.next = rightDummy.next; return leftDummy.next; } }