区块链技术博客
www.b2bchain.cn

程序员进阶之算法练习(五十)LeetCode链表专题求职学习资料

D0b2wT.gif

本文介绍了程序员进阶之算法练习(五十)LeetCode链表专题求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

正文

链表是面试中经常考察的概念,选了4道LeetCode中常见链表题目,难度是Easy和Medium。

1.移除链表第n个节点

题目链接
题目大意:
给出一个链表,删除链表的倒数第n个节点,然后返回链表的头指针。
Example:
给出链表 1->2->3->4->5, and n = 2.
操作后的链表 1->2->3->5.

题目解析:
这里可以分解两个子问题:
1、找到链表倒数第n个点;
2、在链表中删除一个节点;

问题1可以先遍历指针得到节点个数sum,这样可以得到删除的节点为正数的第sum-n+1个节点;
问题2是标准问题,注意next指针的特殊处理;

这里有个trick,如果删除的节点是第一个节点,此时应该返回head->next的节点;
其他情况,类似 1->3->x->4->6,这样的链表,删除中间x点,只需要找到x的上一个节点,使得其next等于x的下一个节点即可。

复杂度解析:
时间复杂度是O(N)
空间复杂度是O(N)

class Solution { public:     ListNode* removeNthFromEnd(ListNode* head, int n) {         ListNode *tmp = head;         int count = 1;         while (tmp->next) {             tmp = tmp->next;             ++count;         }         int x = count - n + 1;          ListNode *ret = head;         if (x == 1) {             ret = head -> next;         }         else {             tmp = head;             while (x > 2) {                 --x;                 tmp = tmp->next;             }             if (tmp->next) {                 tmp->next = tmp->next->next;             }             else {                 tmp->next = NULL;             }         }          return ret;     } };

2.合并两个有序链表

题目链接
题目大意:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

题目解析:
遍历两个链表,每次从链表中选择一个较小大数字的节点出来,直接两个链表为空;
注意:需要考虑两个链表,部分为空或者全部为空的情况;

class Solution { public:     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {         ListNode *ret = NULL, *cur = NULL;         while (l1 && l2) {             if (l1->val < l2->val) {                 if (!cur) {                     cur = ret = l1;                 }                 else {                     cur->next = l1;                 }                 cur = l1;                 l1 = l1->next;             }             else {                 if (!cur) {                     cur = ret = l2;                 }                 else {                     cur->next = l2;                 }                 cur = l2;                 l2 = l2->next;             }         }         if (l1) {             if (cur) {                 cur->next = l1;             }             else {                 ret = cur = l1;             }         }         else {             if (cur) {                 cur->next = l2;             }             else {                 ret = cur = l2;             }         }         return ret;     } }leetcode;

3.两两交换链表中的节点

题目链接
题目大意:
给出一个链表,要求每两个节点做一次节点交换,如果是奇数链表,最后一个节点不用交换;
比如说给出1->2->3->4,要求结果是2->1->4->3;
要求:
1、常数的空间大小;
2、不允许修改链表节点的值,只能修改其next指针;

正文

链表是面试中经常考察的概念,选了4道LeetCode中常见链表题目,难度是Easy和Medium。

1.移除链表第n个节点

题目链接
题目大意:
给出一个链表,删除链表的倒数第n个节点,然后返回链表的头指针。
Example:
给出链表 1->2->3->4->5, and n = 2.
操作后的链表 1->2->3->5.

题目解析:
这里可以分解两个子问题:
1、找到链表倒数第n个点;
2、在链表中删除一个节点;

问题1可以先遍历指针得到节点个数sum,这样可以得到删除的节点为正数的第sum-n+1个节点;
问题2是标准问题,注意next指针的特殊处理;

这里有个trick,如果删除的节点是第一个节点,此时应该返回head->next的节点;
其他情况,类似 1->3->x->4->6,这样的链表,删除中间x点,只需要找到x的上一个节点,使得其next等于x的下一个节点即可。

复杂度解析:
时间复杂度是O(N)
空间复杂度是O(N)

class Solution { public:     ListNode* removeNthFromEnd(ListNode* head, int n) {         ListNode *tmp = head;         int count = 1;         while (tmp->next) {             tmp = tmp->next;             ++count;         }         int x = count - n + 1;          ListNode *ret = head;         if (x == 1) {             ret = head -> next;         }         else {             tmp = head;             while (x > 2) {                 --x;                 tmp = tmp->next;             }             if (tmp->next) {                 tmp->next = tmp->next->next;             }             else {                 tmp->next = NULL;             }         }          return ret;     } };

2.合并两个有序链表

题目链接
题目大意:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

题目解析:
遍历两个链表,每次从链表中选择一个较小大数字的节点出来,直接两个链表为空;
注意:需要考虑两个链表,部分为空或者全部为空的情况;

class Solution { public:     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {         ListNode *ret = NULL, *cur = NULL;         while (l1 && l2) {             if (l1->val < l2->val) {                 if (!cur) {                     cur = ret = l1;                 }                 else {                     cur->next = l1;                 }                 cur = l1;                 l1 = l1->next;             }             else {                 if (!cur) {                     cur = ret = l2;                 }                 else {                     cur->next = l2;                 }                 cur = l2;                 l2 = l2->next;             }         }         if (l1) {             if (cur) {                 cur->next = l1;             }             else {                 ret = cur = l1;             }         }         else {             if (cur) {                 cur->next = l2;             }             else {                 ret = cur = l2;             }         }         return ret;     } }leetcode;

3.两两交换链表中的节点

题目链接
题目大意:
给出一个链表,要求每两个节点做一次节点交换,如果是奇数链表,最后一个节点不用交换;
比如说给出1->2->3->4,要求结果是2->1->4->3;
要求:
1、常数的空间大小;
2、不允许修改链表节点的值,只能修改其next指针;

正文

链表是面试中经常考察的概念,选了4道LeetCode中常见链表题目,难度是Easy和Medium。

1.移除链表第n个节点

题目链接
题目大意:
给出一个链表,删除链表的倒数第n个节点,然后返回链表的头指针。
Example:
给出链表 1->2->3->4->5, and n = 2.
操作后的链表 1->2->3->5.

题目解析:
这里可以分解两个子问题:
1、找到链表倒数第n个点;
2、在链表中删除一个节点;

问题1可以先遍历指针得到节点个数sum,这样可以得到删除的节点为正数的第sum-n+1个节点;
问题2是标准问题,注意next指针的特殊处理;

这里有个trick,如果删除的节点是第一个节点,此时应该返回head->next的节点;
其他情况,类似 1->3->x->4->6,这样的链表,删除中间x点,只需要找到x的上一个节点,使得其next等于x的下一个节点即可。

复杂度解析:
时间复杂度是O(N)
空间复杂度是O(N)

class Solution { public:     ListNode* removeNthFromEnd(ListNode* head, int n) {         ListNode *tmp = head;         int count = 1;         while (tmp->next) {             tmp = tmp->next;             ++count;         }         int x = count - n + 1;          ListNode *ret = head;         if (x == 1) {             ret = head -> next;         }         else {             tmp = head;             while (x > 2) {                 --x;                 tmp = tmp->next;             }             if (tmp->next) {                 tmp->next = tmp->next->next;             }             else {                 tmp->next = NULL;             }         }          return ret;     } };

2.合并两个有序链表

题目链接
题目大意:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

题目解析:
遍历两个链表,每次从链表中选择一个较小大数字的节点出来,直接两个链表为空;
注意:需要考虑两个链表,部分为空或者全部为空的情况;

class Solution { public:     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {         ListNode *ret = NULL, *cur = NULL;         while (l1 && l2) {             if (l1->val < l2->val) {                 if (!cur) {                     cur = ret = l1;                 }                 else {                     cur->next = l1;                 }                 cur = l1;                 l1 = l1->next;             }             else {                 if (!cur) {                     cur = ret = l2;                 }                 else {                     cur->next = l2;                 }                 cur = l2;                 l2 = l2->next;             }         }         if (l1) {             if (cur) {                 cur->next = l1;             }             else {                 ret = cur = l1;             }         }         else {             if (cur) {                 cur->next = l2;             }             else {                 ret = cur = l2;             }         }         return ret;     } }leetcode;

3.两两交换链表中的节点

题目链接
题目大意:
给出一个链表,要求每两个节点做一次节点交换,如果是奇数链表,最后一个节点不用交换;
比如说给出1->2->3->4,要求结果是2->1->4->3;
要求:
1、常数的空间大小;
2、不允许修改链表节点的值,只能修改其next指针;

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 程序员进阶之算法练习(五十)LeetCode链表专题求职学习资料
分享到: 更多 (0)
D0b2wT.gif

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们