3道中等+2道简单
数组和字符串打算告一段落,正好最近做的几乎都是双指针,所以今天做链表!
1、合并两个有序链表(难度:简单)
该题对应力扣网址
AC代码
思路简单
/**
* 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* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode* dummy = new ListNode(-1), *p=dummy;
ListNode* p1=list1, *p2=list2;
while(p1!=NULL && p2!=NULL){
if(p1->val<p2->val){
p->next=p1;
p1=p1->next;
}
else{
p->next=p2;
p2=p2->next;
}
p=p->next;
}
if(p1!=NULL){
p->next=p1;
}
if(p2!=NULL){
p->next=p2;
}
return dummy->next;
}
};
2、分隔链表(难度:中等)
该题对应力扣网址
AC代码
思路比较简单,就是把一个链表先拆分成两个链表,再拼接。
/**
* 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* partition(ListNode* head, int x) {
ListNode* head1=new ListNode(-1);
ListNode* head2=new ListNode(-1);
ListNode* p=head;
ListNode* p1=head1, *p2=head2;
ListNode* s;
while(p!=NULL){
if(p->val<x){
s=new ListNode(p->val);
p1->next=s;
p1=s;
}
else{
s=new ListNode(p->val);
p2->next=s;
p2=s;
}
p=p->next;
}
p1->next=head2->next;
return head1->next;
}
};
3、删除链表的倒数第N个结点(难度:中等)
该题对应力扣网址
AC代码
/**
* 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* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy=new ListNode(-1);
dummy->next=head;
ListNode* p=dummy;
n=n+1;
while(n--){
p=p->next;
}
ListNode* p1=dummy;
ListNode* p2=p;
while(p2!=NULL){
p2=p2->next;
p1=p1->next;
}
p1->next=p1->next->next;
return dummy->next;
}
};
4、链表的中间结点(难度:简单)
该题对应力扣网址
AC代码
使用快慢指针,fast比low指针每次都多走一步。
需要注意的是,空指针的情况,在循环条件里要明确。
/**
* 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* middleNode(ListNode* head) {
ListNode* low=head, *fast=head;
while(fast!=NULL && fast->next!=NULL){
low=low->next;
fast=fast->next->next;
}
return low;
}
};
5、合并两个链表(难度:中等)
该题力扣对应网址
AC代码
模拟,寻常思路,不说了,有点水
/**
* 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* mergeInBetween(ListNode* list1, int a, int b, ListNode* list2) {
ListNode* pre=list1;
for(int i=0;i<a-1;i++){
pre=pre->next;
}
ListNode* pre1=pre;
for(int j=a;j<=b;j++){
pre1=pre1->next;
}
ListNode* rear=list2;
while(rear->next!=NULL){
rear=rear->next;
}
pre->next=list2;
rear->next=pre1->next;
return list1;
}
};