[LeetCode题解]86. 分隔链表 | 三指针 + 虚拟头节点

解题思路

三指针,一个指向前半部分待插入位置,一个指向后半部分待插入位置,最后一个从前往后遍历

代码

/**
 * 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)\)。
上一篇:80×86汇编常用指令


下一篇:ab测试curl测试