ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第4章:LeetCode--链表

2019-08-29 13:53:11  阅读:151  来源: 互联网

标签:head ListNode val next 链表 l2 NULL LeetCode


2. Add Two Numbers:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* ret, *tmp;
        int carry = 0, sum=0;
        ret = tmp = new ListNode(0);
        while(carry||l1||l2){
            sum = carry;
            if(l1)sum+=l1->val;
            if(l2)sum+=l2->val;
            carry = sum/10;
            tmp->val = sum%10;
            if(l1)l1 = l1->next?l1->next:NULL;
            if(l2)l2 = l2->next?l2->next:NULL;
            if(!l1 && !l2 && !carry)return ret;
            tmp->next = new ListNode(0);
            tmp=tmp->next;
        }
        return NULL;
    }
};

 

19. Remove Nth Node From End of List

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if(head == NULL || n == 0) return head;
        ListNode* slow = head;
        ListNode* fast = head;
        ListNode* pre = head;
        if(fast->next == NULL) return NULL; //[1] 1
        while(n>0){ //if n, slow will just point to the nth
            fast = fast->next;
            n--;
        }
        while(fast != NULL){
            fast = fast->next;
            pre = slow;
            slow = slow->next;
        }
        pre->next = slow->next;
        //if pre==slow==head [1,2] 2
        if(pre == slow) return head->next;
         
        return head;
    }
};

  

21. Merge Two Sorted Lists

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
     ListNode *retList = NULL, *tempList = NULL;
     if(!l1 && !l2) return retList;
     int val = 0, val1 = 0, val2 = 0;
     retList = tempList = new ListNode(0);
     while(l1 || l2){
         val1 = l1?l1->val:0;
         val2 = l2?l2->val:0;
         if(((val1<val2) && l1) || !l2){
             tempList->val = val1;
             if(!(l1->next) && !l2) return retList;
             tempList->next = new ListNode(0);
             tempList = tempList->next;
             l1 = (l1->next)?l1->next:NULL;
             continue;
         }
         else{
             tempList->val = val2;
             if(!(l2->next) && !l1) return retList;
              
             tempList->next = new ListNode(0);
             tempList = tempList->next;
             l2 = (l2->next)?l2->next:NULL;
             continue;     
         }
     }
     return retList;
}
//Other guy's solution
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
{
    if(!l1)         // If no l1, return l2
        return l2;
    if(!l2)         // If no l2, return l1
        return l1;
    if(!l2 && !l1)  // If neither, return NULL;
        return NULL;
         
    ListNode* head; // The pointer we will use to construct a merged list
     
     
    if(l1->val < l2->val)   // If l1 less than l2
    {
        head = l1;          // We start at l1
        l1 = l1->next;      // and iterate l1
    }
    else                    // If l2 less than l1
    {
        head = l2;          // We start at l2
        l2 = l2->next;      // and iterate l2
    }
     
    ListNode* ret = head;   // We need to save the addres of the head of the list
     
    while(l1 && l2)         // While both input lists have values
    {
        if(l1->val < l2->val)   // Compare the current values, if l1 is less
        {
            head->next = l1;    // Append the merged list with l1's current address
            l1 = l1->next;      // Advance l1
        }
        else                    // Else, l2 had the low value
        {
            head->next = l2;    // Append l2 to the list
            l2 = l2->next;      // Advance l2
        }
        head->next->next = NULL;    // Append a NULL teminator to the list
        head = head->next;          // Advance the merged list
    }
     
    // Lastly, if list were different lengths, we need to append the longer list tail to the merged list
     
    if(l1)
        head->next = l1;
    else if(l2)
        head->next = l2;
         
    return ret; // Return the starting address of head that we saved.
}

  

24. Swap Nodes in Pairs

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* first = head;
        if(head == NULL || head->next == NULL)return head;
        ListNode* second = head->next;
        ListNode* ret = second;
        ListNode* third = second->next;
        
        second->next = first;
        
        while(third && third->next){
            first->next = third->next;
            first = third;
            second = third->next;
            third = second->next;
            second->next = first;
        }
        if(third == NULL){
            second->next = first;
            first->next = NULL;
        }else{
            //third->next =NULL
            first->next = third;
        }
        return ret;
    }
};

 

61. Rotate List

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if(head == NULL || k==0) return head;
        int len = 1;
        ListNode* orighead = head;
        ListNode* newhead=head;
        while(head->next){
            len++;
            head = head->next;
        }
        //loop the link
        head->next = orighead;
        k = len - k%len-1; //find the front node of kth.
        while(k){
            newhead = newhead->next;
            k--;
        }
        ListNode* ret = newhead->next;
        newhead->next = NULL;
        return ret;
    }
};

 

83. Remove Duplicates from Sorted List:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode *dup = NULL;
        ListNode *cur = head;
        if(cur == NULL || cur->next == NULL) return head;
        ListNode *nxt = cur->next;
        while(nxt != NULL){
            if(cur->val == nxt->val){
                ListNode *dup = nxt;
                nxt = nxt->next;
                cur->next = nxt;
                delete dup;
            }else{
                cur = nxt;
                nxt = nxt->next;
            }
        }
        return head;
    }
};

 

141. Linked List Cycle

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode* slow = head;
        ListNode* fast = head;
        while(fast && fast->next){
            slow = slow->next;
            fast = fast->next->next; //2step
            if(slow == fast) return true;
        }
        return false;
    }
};

   

147. Insertion Sort List

class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
        ListNode* dummy = new ListNode(0);
        ListNode* pre = dummy;
        ListNode* curr = head;
        if(head == NULL || head->next == NULL) return head;
        ListNode* next = NULL;
        
        while(curr != NULL){
            next = curr->next;
            while(pre->next != NULL && pre->next->val < curr->val){ //find insert pos
                pre = pre->next;
            }
            curr->next = pre->next; //insert
            pre->next = curr;
            curr = next; //move curr to next node
            pre = dummy;//reset the pre
        }
        return dummy->next;
    }
};

 

148. Sort List

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* sortList(ListNode* head) {
        ListNode*p = head;
        ListNode*q = NULL;
        int temp = 0;
        if(head == NULL) return head;
        for(; p!=NULL; p=p->next)
            for(q=p->next; q!=NULL; q=q->next){
                if(p->val > q->val){
                    temp = p->val;
                    p->val = q->val;
                    q->val = temp;
                }
            }
        return head;
    }
};

 

160. Intersection of Two Linked Lists

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* p1 = headA;
        ListNode* p2 = headB;
        while(p1 != p2){
            p1 = p1?p1->next:headB;
            p2 = p2?p2->next:headA;
        }
        return p1;
    }
};

 

203. Remove Linked List Elements  

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        if(head == NULL) return head;
        ListNode* p = head;
         
        while (p->next != NULL){
            if(p->next->val == val){
                ListNode *tmp = p->next;
                p->next = p->next->next;
                delete tmp;
            }
            else{
                p = p->next;
            }
        }
        if(head->val == val)
            head = head->next;
        return head;
    }
};

 

206. Reverse Linked List:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head == NULL || head->next == NULL) return head;
        ListNode* pre = NULL;
        ListNode* cur = head;
        ListNode* nx = cur->next;
        while(nx != NULL){
            cur->next = pre;
            pre = cur;
            cur = nx;
            nx = nx->next;
        }
        cur->next = pre;
        return cur;
    }
};

 

237. Delete Node in a Linked List  

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    void deleteNode(ListNode* node) {
        ListNode* p = node->next;
        node->val = p->val;
        node->next = p->next;
        delete p;
    }
};

 

https://www.cnblogs.com/upcwanghaibo/p/6928887.html

https://blog.csdn.net/qq_37466121/article/details/88204678

https://www.cnblogs.com/upcwanghaibo/p/6928887.html

  

  

标签:head,ListNode,val,next,链表,l2,NULL,LeetCode
来源: https://www.cnblogs.com/feliz/p/11147347.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有