● 请你手写代码,如何合并两个有序链表
注意设置一个头结点
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* tmp=new ListNode(-1);
ListNode* res=tmp;
ListNode* a=l1,*b=l2;
while(a&&b){
if(a->val<=b->val){
tmp->next=a;
a=a->next;
}
else{
tmp->next=b;
b=b->next;
}
tmp=tmp->next;
}
if(a) tmp->next=a;
if(b) tmp->next=b;
return res->next;
}
};
● 手写代码:反转链表
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head) return head;
ListNode*i=head;
ListNode*j=head->next;
i->next=NULL;
while(j){
ListNode*now=j->next;
j->next=i;
i=j;
j=now;
}
return i;
}
};
● 判断一个链表是否为回文链表,说出你的思路并手写代码
方法一:使用stack
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(!head||!head->next) return true;
stack<int> s;
ListNode*i=head;
ListNode*j=head->next;
s.push(i->val);
while(j->next&&j->next->next){
//s.push(i->val);
i=i->next;
j=j->next->next;
s.push(i->val);
}
if(j->next) i=i->next;
while(!s.empty()){
int now=s.top();
if(now!=i->next->val) return false;
i=i->next;
s.pop();
}
return true;
}
};
方法二:反转后半部分链表
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(!head||!head->next) return true;
ListNode* a=head;
ListNode*b=head->next;
ListNode*pre=NULL;
while(b!=NULL&&b->next!=NULL){
a=a->next;
b=b->next->next;
}
while(a!=NULL){
ListNode*tmp=a->next;
a->next=pre;
pre=a;
a=tmp;
}
while(head!=NULL&&pre!=NULL){
if(pre->val!=head->val) return false;
pre=pre->next;
head=head->next;
}
return true;
}
};
如何判断两个单向链表是否相交
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA||!headB) return nullptr;
int a=func(headA),b=func(headB);
if(a>b){
int t=a-b;
while(t--)
headA=headA->next;
}
else if(b>a){
int t=b-a;
while(t--)
headB=headB->next;
}
while(headA!=headB){
headA=headA->next;
headB=headB->next;
}
return headA;
}
int func(ListNode*a){
int count=0;
while(a){
count++;
a=a->next;
}
return count;
}
};