Leetcode: Partition List
思路:
1. 空间复杂度为 o(n) 解法. 创建两个链表, 分别记录大于 x 和小于 x 的节点, 最后合并
2. o(1) 的空间复杂度解法. 四个指针, 分别指向小于 x 部分链表的头, 尾, 指向大于 x 部分链表的头, 尾
总结:
1. 使用 dummyNode 减少判断
代码:
class Solution { public: ListNode *partition(ListNode *head, int x) { ListNode *first, *second, *third, *fourth; if(head == NULL) return head; ListNode *cursor = head; ListNode *dummyNode = new ListNode(0); dummyNode->next = head; first = second = dummyNode; while(cursor && cursor->val < x) { second = cursor; cursor = cursor->next; } if(cursor && cursor->val >= x) { third = cursor; fourth = cursor; } while(cursor) { if(cursor->val < x) { second->next = cursor; fourth->next = cursor->next; cursor->next = third; second = cursor; }else{ fourth = cursor; } cursor = cursor->next; } return dummyNode->next; } };
Update
较为简洁的代码
class Solution { public: ListNode *partition(ListNode *head, int x) { if(head == NULL) return head; ListNode *sm = new ListNode(0), *sm_tail = sm; ListNode *bg = new ListNode(0), *bg_tail = bg; ListNode *cur = head; while(cur) { if(cur->val < x) { sm_tail->next = cur; cur = cur->next; sm_tail = sm_tail->next; sm_tail->next = NULL; }else{ bg_tail->next = cur; bg_tail = bg_tail->next; cur = cur->next; bg_tail->next = NULL; } } sm_tail->next = bg->next; return sm->next; } };