LeetCode:143. 重排链表(C++带详细注释)
/**
* 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:
void reorderList(ListNode* head) {
ListNode*l1=head,*l2=head;//定义两个链表
ListNode*tep=head;//临时变量
int len=0;//表长
while(tep)//求表长
{
len++;
tep=tep->next;
}
if(len<=2) return;//长度小于等于2直接返回
int len1=len/2+len%2;//表1长度
int len2=len/2;//表2长度
for(int i=0;i<len1-1;i++)//找表2位置
{
head=head->next;
}
l2=head->next;//找到表2
head->next=nullptr;//截断表1
head=l1;//head重新指向表1头部
stack<ListNode*>stk;//l2的栈
while(l2)//将l2压栈
{
stk.push(l2);
l2=l2->next;
}
while(!stk.empty())//将l2元素弹栈插入l1
{
tep=stk.top();//暂存栈顶元素并出栈
stk.pop();
tep->next=l1->next;//在l1中插入tep
l1->next=tep;
l1=tep->next;//l1指向下一位
}
}
};