赞
踩
1. 移除链表元素
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
- class Solution {
- public:
- ListNode* removeElements(ListNode* head, int val) {
- struct ListNode* dummyHead = new ListNode(0, head);//建立头节点
- struct ListNode* temp = dummyHead;
- while (temp->next != NULL) {
- if (temp->next->val == val) {
- temp->next = temp->next->next;
- } else {
- temp = temp->next;
- }
- }
- return dummyHead->next;
- }
- };
时间复杂度:O(n);
空间复杂度:O(1);
2. 旋转链表
给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
- class Solution {
- public:
- ListNode* rotateRight(ListNode* head, int k) {
- if (k == 0 || head == nullptr || head->next == nullptr) {
- return head;
- }
- int n = 1;
- ListNode* iter = head;
- while (iter->next != nullptr) {
- iter = iter->next;
- n++;
- }
- int add = n - k % n;
- if (add == n) {
- return head;
- }
- iter->next = head;
- while (add--) {
- iter = iter->next;
- }
- ListNode* ret = iter->next;
- iter->next = nullptr;
- return ret;
- }
- };
时间复杂度:O(n);
空间复杂度:O(1);
3. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
- class Solution {
- public:
- ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
- ListNode* preHead = new ListNode(-1);
-
- ListNode* prev = preHead;
- while (l1 != nullptr && l2 != nullptr) {
- if (l1->val < l2->val) {
- prev->next = l1;
- l1 = l1->next;
- } else {
- prev->next = l2;
- l2 = l2->next;
- }
- prev = prev->next;
- }
-
- // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
- prev->next = l1 == nullptr ? l2 : l1;
-
- return preHead->next;
- }
- };
时间复杂度:O(m+n);
空间复杂度:O(1);
4. 相交链表
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null
。
- /**
- * 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) {
- if(headA==nullptr || headB==nullptr){
- return nullptr;
- }
- ListNode* p=headA;
- ListNode* q=headB;
- while(p!=q){
- if(p==nullptr){//---->注意
- p=headB;
- }else{
- p=p->next;
- }
- if(q==nullptr){
- q=headA;
- }else{
- q=q->next;
- }
- }
- return p;
- }
- };
时间复杂度:O(m+n);
空间复杂度:O(1);
给定一个已排序的链表的头 head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
- /**
- * Definition for singly-linked list.
- * struct ListNode {
- * int val;
- * ListNode *next;
- * ListNode() : val(0), next(nullptr) {}
- * ListNode(int x) : val(x), next(nullptr) {}
- * ListNode(int x, ListNode *next) : val(x), next(next) {}
- * };
- */
- class Solution {
- public:
- ListNode* deleteDuplicates(ListNode* head) {
- if(head==nullptr || head->next==nullptr){
- return head;
- }
- ListNode* dummy=new ListNode(0, head);
- ListNode* cur=dummy;
- while(cur->next && cur->next->next){
- if(cur->next->val==cur->next->next->val){
- int x=cur->next->val;
- while(cur->next && cur->next->val==x){
- cur->next=cur->next->next;
- }
- }else{
- cur=cur->next;
- }
- }
- return dummy->next;
- }
- };
时间复杂度:O(n);
空间复杂度:O(1);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。