解题思路
三指针,一个指向前半部分待插入位置,一个指向后半部分待插入位置,最后一个从前往后遍历
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode Partition(ListNode head, int x) {
// 三指针,一个指向前半部分待插入位置,一个指向后半部分待插入位置,最后一个从前往后遍历
ListNode dummyP = new ListNode(0), dummyQ = new ListNode(0);
ListNode p = dummyP, q = dummyQ, cur = head;
while(cur != null) {
if(cur.val < x) {
p.next = cur;
p = p.next;
} else {
q.next = cur;
q = q.next;
}
cur = cur.next;
}
p.next = dummyQ.next; // 拼接两个链表
q.next = null; // 并把后半部分链表的尾部设置为 null
return dummyP.next;
}
}
复杂度分析
- 时间复杂度:\(O(n)\),其中 \(n\) 是链表长度。
- 空间复杂度:\(O(1)\)。