剑指 Offer II 024. 反转链表
从头依次翻转即可
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head) return head;
ListNode* p=head->next;
if(!p) return head;
ListNode* q=head;
head->next=NULL;
while(p){
q=p->next;
p->next=head;
head=p;
p=q;
}
return head;
}
};
剑指 Offer II 025. 链表中的两数相加
压入栈计算
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
stack<int>num1,num2;
while(l1){
num1.push(l1->val);
l1=l1->next;
}
while(l2){
num2.push(l2->val);
l2=l2->next;
}
ListNode* p;
p=nullptr;
int jw=0;
while(num1.size()>0||num2.size()>0){
int cnt1=0,cnt2=0;
if(num1.size()>0){cnt1=num1.top();num1.pop();}
if(num2.size()>0){cnt2=num2.top();num2.pop();}
int cnt3=cnt1+cnt2+jw;
jw=cnt3/10;
cnt3%=10;
ListNode* newnode = new ListNode(cnt3,p);
p=newnode;
}
if(jw>0){
ListNode* newnode = new ListNode(jw,p);
p=newnode;
}
return p;
}
};
剑指 Offer II 026. 重排链表
查找中点,翻转后半部分,再遍历链表添加
class Solution {
public:
void reorderList(ListNode* head) {
if(!head) return ;
if(!head->next) return ;
ListNode* fast;
ListNode* slow;
fast=head;
slow=head;
while(fast->next&&fast->next->next){
fast=fast->next->next;
slow=slow->next;
}
ListNode* back;
back=slow->next;
fast=slow;
fast->next=NULL;
slow=back->next;
back->next=NULL;
while(slow){
ListNode* p=slow->next;
slow->next=back;
back=slow;
slow=p;
}
while(back){
fast=head->next;
slow=back->next;
head->next=back;
back->next=fast;
head=fast;
back=slow;
}
}
};