当前位置:   article > 正文

Task02:链表_struct listnode* dummyhead = new listnode(0, head)

struct listnode* dummyhead = new listnode(0, head);

1. 移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

  1. class Solution {
  2. public:
  3. ListNode* removeElements(ListNode* head, int val) {
  4. struct ListNode* dummyHead = new ListNode(0, head);//建立头节点
  5. struct ListNode* temp = dummyHead;
  6. while (temp->next != NULL) {
  7. if (temp->next->val == val) {
  8. temp->next = temp->next->next;
  9. } else {
  10. temp = temp->next;
  11. }
  12. }
  13. return dummyHead->next;
  14. }
  15. };

时间复杂度:O(n);

空间复杂度:O(1);

2. 旋转链表

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

  1. class Solution {
  2. public:
  3. ListNode* rotateRight(ListNode* head, int k) {
  4. if (k == 0 || head == nullptr || head->next == nullptr) {
  5. return head;
  6. }
  7. int n = 1;
  8. ListNode* iter = head;
  9. while (iter->next != nullptr) {
  10. iter = iter->next;
  11. n++;
  12. }
  13. int add = n - k % n;
  14. if (add == n) {
  15. return head;
  16. }
  17. iter->next = head;
  18. while (add--) {
  19. iter = iter->next;
  20. }
  21. ListNode* ret = iter->next;
  22. iter->next = nullptr;
  23. return ret;
  24. }
  25. };

时间复杂度:O(n);

空间复杂度:O(1);

3. 合并两个有序链表

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

  1. class Solution {
  2. public:
  3. ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
  4. ListNode* preHead = new ListNode(-1);
  5. ListNode* prev = preHead;
  6. while (l1 != nullptr && l2 != nullptr) {
  7. if (l1->val < l2->val) {
  8. prev->next = l1;
  9. l1 = l1->next;
  10. } else {
  11. prev->next = l2;
  12. l2 = l2->next;
  13. }
  14. prev = prev->next;
  15. }
  16. // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
  17. prev->next = l1 == nullptr ? l2 : l1;
  18. return preHead->next;
  19. }
  20. };

时间复杂度:O(m+n);

空间复杂度:O(1);

4. 相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

  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 *getIntersectionNode(ListNode *headA, ListNode *headB) {
  12. if(headA==nullptr || headB==nullptr){
  13. return nullptr;
  14. }
  15. ListNode* p=headA;
  16. ListNode* q=headB;
  17. while(p!=q){
  18. if(p==nullptr){//---->注意
  19. p=headB;
  20. }else{
  21. p=p->next;
  22. }
  23. if(q==nullptr){
  24. q=headA;
  25. }else{
  26. q=q->next;
  27. }
  28. }
  29. return p;
  30. }
  31. };

时间复杂度:O(m+n);

空间复杂度:O(1);

5. 删除排序链表中的重复数字II

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

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

时间复杂度:O(n);

空间复杂度:O(1);

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/533052
推荐阅读
相关标签
  

闽ICP备14008679号