zoukankan      html  css  js  c++  java
  • leetcode链表题

    1. sort_list

    Sort a linked list in O(n log n) time using constant space complexity.

    分析:时间复杂度是nlogn,所以可以考虑归并排序。取中点,对左边和右边分别递归排序,最后合并。

    知识点:快慢指针,用来取链表中点;归并排序。

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *sortList(ListNode *head) {
    12         if(!head||!head->next)return head;
    13         ListNode *first = head;
    14         ListNode *second = head->next;
    15         while(second&&second->next){
    16             first=first->next;
    17             second=second->next->next;
    18         }
    19         ListNode *left = sortList(first->next);
    20         first->next = NULL;
    21         ListNode *right = sortList(head);
    22         return merge(left,right);
    23     }
    24     ListNode *merge(ListNode *head1, ListNode *head2)
    25      {
    26          if(head1 == NULL)return head2;
    27          if(head2 == NULL)return head1;
    28          ListNode *res , *p ;
    29          if(head1->val < head2->val)
    30              {res = head1; head1 = head1->next;}
    31          else{res = head2; head2 = head2->next;}
    32          p = res;
    33          
    34          while(head1 != NULL && head2 != NULL)
    35          {
    36              if(head1->val < head2->val)
    37              {
    38                  p->next = head1;
    39                  head1 = head1->next;
    40              }
    41              else
    42              {
    43                  p->next = head2;
    44                  head2 = head2->next;
    45              }
    46              p = p->next;
    47          }
    48          if(head1 != NULL)p->next = head1;
    49          else if(head2 != NULL)p->next = head2;
    50          return res;
    51      }
    52 };

    2. linked-list-cycle-ii

    Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull.

    Follow up:
    Can you solve it without using extra space?

    分析:寻找链表的入环节点,也是使用快慢指针,快慢指针第一次相遇后将快指针放回链表头,然后以相同的速度前进,再次相遇的节点就是链表的入环节点。

    知识点:快慢指针找入环节点

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *detectCycle(ListNode *head) {
    12         while(!head||!head->next)return nullptr;
    13         ListNode *slow = head;
    14         ListNode *fast = head;
    15         while(fast != NULL && fast->next != NULL){
    16             slow=slow->next;
    17             fast=fast->next->next;
    18             if(fast==slow)break;
    19         }
    20         if(!fast||!fast->next)return nullptr;
    21         fast=head;
    22         while(slow != fast){
    23             slow = slow->next;
    24             fast = fast->next;
    25         }
    26         return slow;
    27     }
    28 };

     3. convert-sorted-list-to-binary-search-tree

         Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

    分析:可以递归建立平衡二叉查找树,将链表中间的值设为树的根,对左边和右边分别建立二叉查找树。

    知识点:递归,快慢指针

    class Solution {
    public:
        TreeNode *sortedListToBST(ListNode *head) {
            return ToBST(head,nullptr);
        }
        TreeNode *ToBST(ListNode *head,ListNode *tail){
            if(head==tail)return nullptr;
            ListNode *fast = head;
            ListNode *slow = head;
            while(fast!=tail&&fast->next!=tail){
                fast=fast->next->next;
                slow=slow->next;
            }
            TreeNode *tr= new TreeNode(slow->val);
            tr->left = ToBST(head,slow);
            tr->right = ToBST(slow->next,tail);
            return tr;
        }
    };

     4. partition-list

    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,
    Given1->4->3->2->5->2and x = 3,
    return1->2->2->4->3->5.

     分析:将小于某值的节点按顺序移至前面,我这里为了方便直接建立了两个vector分别按序存储值小于x和大于等于x的节点。

    class Solution {
    public:
        ListNode *partition(ListNode *head, int x) {
            vector<int> a;
            vector<int> b;
            ListNode *li=head;
            while(li){
                if(li->val<x)a.push_back(li->val);
                else b.push_back(li->val);
                li = li->next;
            }
            li = head;
            for(int i=0;i<a.size();i++){
                li->val=a[i];
                li=li->next;
            }
            for(int i=0;i<b.size();i++){
                li->val=b[i];
                li=li->next;
            }
            return head;
        }
    };

    5. remove-duplicates-from-sorted-list

    Given a sorted linked list, delete all duplicates such that each element appear only once.

    For example,
    Given1->1->2, return1->2.
    Given1->1->2->3->3, return1->2->3. 

    class Solution {
    public:
        ListNode *deleteDuplicates(ListNode *head) {
            ListNode *li = head;
            while(li&&li->next){
                while(li&&li->next&&(li->next->val == li->val))
                    li->next = li->next->next;
                li = li->next;
            }
            return head;
        }
    };

     6. remove-duplicates-from-sorted-list-ii

    Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

    For example,
    Given1->2->3->3->4->4->5, return1->2->5.
    Given1->1->1->2->3, return2->3.

    分析:这里创建了一个新的头节点,作为第一个不重复的节点;

    class Solution {
    public:
        ListNode *deleteDuplicates(ListNode *head) {
            if((!head)||(!head->next))return head;
            ListNode *newHead = new ListNode(head->val-1);
            newHead->next = head;
            ListNode *last = newHead;
            ListNode *cur = head;
            while(cur&&cur->next){
                if(cur->val!=cur->next->val){
                    last = cur;
                }
                else{
                    while(cur&&cur->next&&(cur->val==cur->next->val)){
                        cur = cur->next;
                    }
                    last->next = cur->next;
                }
                cur = cur->next;
            }
            return newHead->next;
        }
    };
  • 相关阅读:
    AD域渗透测试笔记
    ctf之WEB练习一
    CTF之crpto练习三
    ctf之WEB练习二
    ctf之WEB练习三
    [转]Ant学习笔记——自己构建Ant编译环境
    [转]【NoSQL】NoSQL入门级资料整理(CAP原理、最终一致性)
    啥叫异步调用
    C++中虚函数的作用是什么?它应该怎么用呢?
    [转]Thrift连接池实现
  • 原文地址:https://www.cnblogs.com/xctcherry/p/8515142.html
Copyright © 2011-2022 走看看