链表题(leetcode)

Posted hh13579

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表题(leetcode)相关的知识,希望对你有一定的参考价值。

从头开始学习链表

链表遍历

#include <bits/stdc++.h>
#include <sys/types.h>
#include <unistd.h>
#define ll long long
#define mk make_pair
#define P pair<ll,ll>
const ll N = 1e6 + 10;
const double pi = acos(-1.0);
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
int main()
{
    int n;
    cin >> n;
    ListNode *t = new ListNode(-1);
    ListNode *cur = t;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin >> x;
        cur -> next = new ListNode(x);
        cur = cur -> next;
    }
    cur = t -> next;
    while(cur)
    {
        cout << cur -> val << ‘ ‘;
        cur = cur -> next;
    }
}

合并两个有序链表

#include <bits/stdc++.h>
#include <sys/types.h>
#include <unistd.h>
#define ll long long
#define mk make_pair
#define P pair<ll,ll>
const ll N = 1e6 + 10;
const double pi = acos(-1.0);
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
ListNode* merge(ListNode *l1,ListNode *l2)
{
    ListNode *l3 = new ListNode(-1);
    ListNode * cur = l3;
    while(l1 && l2)
    {
        if(l1 -> val < l2 -> val)
        {
            cur -> next = l1;
            l1 = l1 -> next;
        }
        else
        {
            cur -> next = l2;
            l2 = l2 -> next;
        }
        cur = cur -> next;
    }
    if(l1)
        cur -> next = l1;
    else
        cur -> next = l2;
    return l3 -> next;
}
int main()
{
    int n,m;
    cin >> n >> m;
    ListNode *l1 = new ListNode(-1);
    ListNode *l2 = new ListNode(-1);
    ListNode *cur = l1;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin >> x;
        cur -> next = new ListNode(x);
        cur = cur -> next;
    }
    cur = l2;
    for(int i=1;i<=m;i++)
    {
        int x;
        cin >> x;
        cur -> next = new ListNode(x);
        cur = cur -> next;
    }
    ListNode *l3 = merge(l1->next,l2->next);
    cur = l3;
    while(cur)
    {
        cout << cur->val << ‘ ‘;
        cur = cur -> next;
    }
    return 0;
}

链表相加

#include <bits/stdc++.h>
#include <sys/types.h>
#include <unistd.h>
#define ll long long
#define mk make_pair
#define P pair<ll,ll>
const ll N = 1e6 + 10;
const double pi = acos(-1.0);
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
ListNode* add(ListNode *l1,ListNode *l2)
{
    ListNode *l3 = new ListNode(-1);
    ListNode * cur = l3;
    int t = 0;
    while(l1 || l2)
    {
        int x1 = 0,x2 = 0;
        if(l1)
            x1 = l1 -> val;
        if(l2)
            x2 = l2 -> val;
        int tt = x1 + x2 + t;
        cur -> next = new ListNode(tt%10);
        t = tt / 10;
        cur = cur -> next;
        if(l1)
            l1 = l1 -> next;
        if(l2)
            l2 = l2 -> next;
    }
    if(t)
        cur -> next = new ListNode(t);
    return l3 -> next;
}
int main()
{
    int n,m;
    cin >> n >> m;
    ListNode *l1 = new ListNode(-1);
    ListNode *l2 = new ListNode(-1);
    ListNode *cur = l1;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin >> x;
        cur -> next = new ListNode(x);
        cur = cur -> next;
    }
    cur = l2;
    for(int i=1;i<=m;i++)
    {
        int x;
        cin >> x;
        cur -> next = new ListNode(x);
        cur = cur -> next;
    }
    ListNode *l3 = add(l1->next,l2->next);
    cur = l3;
    while(cur)
    {
        cout << cur->val << ‘ ‘;
        cur = cur -> next;
    }
    return 0;
}

排序链表

#include <bits/stdc++.h>
#include <sys/types.h>
#include <unistd.h>
#define ll long long
#define mk make_pair
#define P pair<ll,ll>
const ll N = 1e6 + 10;
const double pi = acos(-1.0);
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
ListNode* merge(ListNode *l1,ListNode *l2)
{
    ListNode *l3 = new ListNode(-1);
    ListNode * cur = l3;
    while(l1 && l2)
    {
        if(l1 -> val < l2 -> val)
        {
            cur -> next = l1;
            l1 = l1 -> next;
        }
        else
        {
            cur -> next = l2;
            l2 = l2 -> next;
        }
        cur = cur -> next;
    }
    if(l1)
        cur -> next = l1;
    else
        cur -> next = l2;
    return l3 -> next;
}
ListNode* sort(ListNode *head)
{
    if(!head || !head->next)
        return head;
    ListNode *fast = head,*slow = head,*mid = head;
    while(fast)// 1 2 3
    {
        mid = slow;
        slow = slow -> next;
        if(fast->next)
            fast = fast -> next -> next;
        else
            break;

    }
    mid -> next = NULL;
    return merge(sort(head),sort(slow));
}
int main()
{
    int n;
    cin >> n;
    ListNode *l1 = new ListNode(-1);
    ListNode *cur = l1;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin >> x;
        cur -> next = new ListNode(x);
        cur = cur -> next;
    }
    ListNode* l2 = sort(l1->next);
    cur = l2;
    while(cur)
    {
        cout << cur->val << ‘ ‘;
        cur = cur -> next;
    }
    return 0;
}

合并k个排序链表

#include <bits/stdc++.h>
#include <sys/types.h>
#include <unistd.h>
#define ll long long
#define mk make_pair
#define P pair<ll,ll>
const ll N = 1e6 + 10;
const double pi = acos(-1.0);
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
ListNode* mergeTwoListNode(ListNode *l1,ListNode *l2)
{
    ListNode *l3 = new ListNode(-1);
    ListNode * cur = l3;
    while(l1 && l2)
    {
        if(l1 -> val < l2 -> val)
        {
            cur -> next = l1;
            l1 = l1 -> next;
        }
        else
        {
            cur -> next = l2;
            l2 = l2 -> next;
        }
        cur = cur -> next;
    }
    if(l1)
        cur -> next = l1;
    else
        cur -> next = l2;
    return l3 -> next;
}
ListNode *merge(vector<ListNode*>lists,int left,int right)
{
    if(left == right)
        return lists[left];
    int mid = (left + right) / 2;
    ListNode *l1 = merge(lists,left,mid);
    ListNode *l2 = merge(lists,mid+1,right);
    return mergeTwoListNode(l1,l2);
}
ListNode* mergeKLists(vector<ListNode*>& lists)
{
    int k = lists.size();
    ListNode *head = new ListNode(-1);
    return merge(lists,0,k-1);
}
int main()
{
    int n,k,x;
    cin >> k;
    vector<ListNode*> v;
    for(int i=1;i<=k;i++)
    {
        cin >> n;
        ListNode *head = new ListNode(-1);        ListNode *cur = head;
        for(int j=1;j<=n;j++)
        {
            cin >> x;
            cur->next = new ListNode(x);
            cur = cur -> next;
        }
        v.push_back(head->next);
    }
//    ListNode *cur = new ListNode(-1);
//    cur->next = v[0];
//    while(cur)
//    {
//        cout << cur -> val;
//        cur = cur -> next;
//    }
    ListNode *l1 = mergeKLists(v);
    while(l1)
    {
        cout << l1 -> val << ‘ ‘;
        l1 = l1 -> next;
    }
    return 0;
}
/*
 3
3 1 2 3
2 1 2
1 1
 1
 3 3 2 1
 */

删除链表倒数第k个节点

#include <bits/stdc++.h>
#include <sys/types.h>
#include <unistd.h>
#define ll long long
#define mk make_pair
#define P pair<ll,ll>
const ll N = 1e6 + 10;
const double pi = acos(-1.0);
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
ListNode* eraseListNodeKth(ListNode *head,int k)
{
    ListNode *cur = head;
    int len = 0;
    while(cur)
    {
        cur = cur -> next;
        len++;
    }
    ListNode *ans = new ListNode(-1);
    ListNode *cur1 = head;
    cur = ans;
    for(int i=0;i<len;i++)
    {
        if(i==len-k)
        {
            cur1 = cur1 -> next;
        }
        if(!cur1)
            break;
        cur -> next = new ListNode(cur1->val);
        cur = cur -> next;
        cur1 = cur1 -> next;
    }
    return ans->next;
}
int main()
{
    int n,x,k;
    cin >> n >> k;
    ListNode* head = new ListNode(-1);
    ListNode* cur = head;
    for(int i=1;i<=n;i++)
    {
        cin >> x;
        cur -> next = new ListNode(x);
        cur = cur -> next;
    }
    ListNode* ans = eraseListNodeKth(head->next,k);
    while(ans)
    {
        cout << ans -> val << ‘ ‘;
        ans = ans -> next;
    }
    return 0;
}

链表反转

#include <bits/stdc++.h>
#include <sys/types.h>
#include <unistd.h>
#define ll long long
#define mk make_pair
#define P pair<ll,ll>
const ll N = 1e6 + 10;
const double pi = acos(-1.0);
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
ListNode* reverseList(ListNode *head)
{
    ListNode *cur = NULL;
    ListNode *pre = head;
    while(pre)
    {
        ListNode *t = pre -> next;
        pre -> next = cur;
        cur = pre;
        pre = t;
    }
    return cur;
}
int main()
{
    int n,x,k;
    cin >> n;
    ListNode* head = new ListNode(-1);
    ListNode* cur = head;
    for(int i=1;i<=n;i++)
    {
        cin >> x;
        cur -> next = new ListNode(x);
        cur = cur -> next;
    }
    ListNode* ans = reverseList(head->next);
    while(ans)
    {
        cout << ans -> val << ‘ ‘;
        ans = ans -> next;
    }
    return 0;
}

链表去重

#include <bits/stdc++.h>
#include <sys/types.h>
#include <unistd.h>
#define ll long long
#define mk make_pair
#define P pair<ll,ll>
const ll N = 1e6 + 10;
const double pi = acos(-1.0);
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
void deleteDuplicates(ListNode* head) {
    ListNode *cur = head;
    while(cur)
    {
        while(cur->next && cur->val == cur->next->val)
        {
            cur ->next = cur -> next -> next;
        }
        cur = cur -> next;
    }
}
int main()
{
    int n,x,k;
    cin >> n;
    ListNode* head = new ListNode(-1);
    ListNode* cur = head;
    for(int i=1;i<=n;i++)
    {
        cin >> x;
        cur -> next = new ListNode(x);
        cur = cur -> next;
    }
    deleteDuplicates(head->next);
    cur = head -> next;
    while(cur)
    {
        cout << cur -> val << ‘ ‘;
        cur = cur -> next;
    }
    return 0;
}

交换链表两个节点

#include <bits/stdc++.h>
#include <sys/types.h>
#include <unistd.h>
#define ll long long
#define mk make_pair
#define P pair<ll,ll>
const ll N = 1e6 + 10;
const double pi = acos(-1.0);
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
ListNode* swap2(ListNode *head)
{
    if(!head || !head -> next)
        return head;
    ListNode *ans = new ListNode(-1);
    ans ->next = head;
    ListNode *cur = ans;
    while(cur -> next&& cur -> next->next) {
        ListNode *now = cur->next, *nxt = cur->next->next, *t = nxt->next;
        nxt->next = now;
        cur -> next = nxt;
        now->next = t;
        cur = now;
    }
    return ans -> next;
}
//-1 -> 1 -> 2 -> 3 -> 4 -> 5
// -1 -> 2 -> 1 -> 3 <- 4  5
int main()
{
    int n,x;
    cin >> n;
    ListNode *head = new ListNode(-1);
    ListNode *cur = head;
    for(int i=1;i<=n;i++)
    {
        cin >> x;
        cur -> next =  new ListNode(x);
        cur = cur -> next;
    }
    cur = swap2(head -> next);
    while(cur)
    {
        cout << cur -> val << ‘ ‘;
        cur = cur -> next;
    }
    return 0;
}

以上是关于链表题(leetcode)的主要内容,如果未能解决你的问题,请参考以下文章

链表题(leetcode)

leetcode简单链表题技巧总结

LeetCode链表题总结(持续更新)

链表题--01----K 个一组翻转链表

链表题--04----删除链表中给定的节点

几道简单的链表题